トップページ > 記事閲覧
D3DXVec3TransformCoord互換の関数について
名前:Stnsllet 日時: 2021/11/03 12:27

お世話になっております。 行列の計算に関する関数の扱いについて不明点がありましたので、 質問させていただきます。 現在DirectXで書かれたコードをDXライブラリで書き直している最中ですが、 D3DXVec3TransformCoordを置き換えようとし、 この掲示板の過去ログで見つけた記述より、 VTransformやVectorTransformを代替の関数として置き換えたところ、 望む結果と計算結果が異なったため、使うべき関数を間違えているのか、 ライブラリの仕様なのかが不明で、結局D3DXVec3TransformCoordを使っている状況です。 ほぼD3DXVec3TransformCoordの為だけにd3dx9.hをインクルードする形となっているため、 出来ればVTransform等、DXライブラリ内だけで解決したいと考えています。 もし関数の使い方について間違いがあれば教えていただけると幸いです。 よろしくお願いします。 参考にした過去ログ ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=past&no=1554 実際動作中のプログラムにおける該当のコードは以下の通りとなります。 // DXLIB 3.22e VSC++ 64bit MATRIX BMat; BMat.m[0][0] = 824.243164f; BMat.m[0][1] = 0.0f; BMat.m[0][2] = 0.0f; BMat.m[0][3] = 0.0f; BMat.m[1][0] = -200.0f; BMat.m[1][1] = 563.815552f; BMat.m[1][2] = -0.750f; BMat.m[1][3] = -0.50f; BMat.m[2][0] = -346.410156f; BMat.m[2][1] = -671.929199f; BMat.m[2][2] = -1.29903805f; BMat.m[2][3] = -0.866025388f; BMat.m[3][0] = 230400.0f; BMat.m[3][1] = 172800.0f; BMat.m[3][2] = 432.0f; BMat.m[3][3] = 576.0f; VECTOR TransSource = VGet(-477.401154, -467.319366, 0); VECTOR Output; VectorTransform(&Output, &TransSource, &BMat); // Output = {x=-69630.7500 y=-90681.9375 z=782.489502 } // 望んではいない結果。更に加工が必要? // Output = VTransform(TransSource, BMat); // この結果はVectorTransformと同等 D3DXMATRIX mat( 824.243164f, 0.0f, 0.0f, 0.0f, -200.0f, 563.815552f, -0.750f, -0.50f, -346.410156f, -671.929199f, -1.29903805f, -0.866025388f, 230400.0f, 172800.0f, 432.0f, 576.0f ); D3DXVECTOR3 SRC(-477.401154, -467.319366, 0); D3DXVECTOR3 Vec3Out; D3DXVec3TransformCoord(&Vec3Out, (D3DXVECTOR3*)&SRC, &mat); // _D3DVECTOR = {x=-86.0000305 y=-112.000076 z=0.966442585 } // 望んでいる結果
メンテ

Page: 1 |

Re: D3DXVec3TransformCoord互換の関数について ( No.1 )
名前:Stnsllet 日時:2021/11/03 16:46

一点、全くの別件な上、問題の切り分けが出来ておらず恐縮ですが、 MakeScreenを使用する際に例外 _com_error が二回スローされるという事象を確認しています。 0x00007FFED1DD4F99 で例外がスローされました (program.exe 内): Microsoft C++ の例外: _com_error (メモリの場所 0x000000D5A7DFE660)。 0x00007FFED1DD4F99 で例外がスローされました (program.exe 内): Microsoft C++ の例外: _com_error (メモリの場所 0x000000D5A7DFE820)。 ただ、同じPCの別プロジェクトでは例外のスローが確認できず、発生条件がまだ不明です。 エントリーポイントの先頭でDxLib_Init()の次の行で使ったとしても発生することから、 もしかしたら自前のインクルードファイルの中に問題がある可能性があるので調査は継続している所です。 別にハンドルが作られないという訳でもないですし、プログラム自体は正常に動くのですが、 MakeScreenを呼び出すたびにスローされる為、少しだけ気になっている程度ですが、 もし原因が分かりそうでしたら教えてくださると助かります。
メンテ
Re: D3DXVec3TransformCoord互換の関数について ( No.2 )
名前:管理人 日時:2021/11/05 01:42

VTransform や VectorTransform は D3DXVec3TransformCoord で行っている 『最後に W で X, Y, Z を除算する』という処理を行っていないので、それが計算結果が異なる原因となっています VectorTransform の代わりに VectorTransform4 を使用して、計算結果の Output の x, y, z を w の値で除算することで D3DXVec3TransformCoord と同じ結果を得ることができます VECTOR TransSource = VGet(-477.401154, -467.319366, 0); float TransSourceW = 1.0; VECTOR Output; float OutputW; VectorTransform4(&Output, &OutputW, &TransSource, &TransSourceW, &BMat); Output.x /= OutputW; Output.y /= OutputW; Output.z /= OutputW; よろしければお試しください m(_ _)m ( 因みに VectorTransform4 の定義は以下のようになっています ) // ベクトル行列と4x4正方行列を乗算する( w の要素を渡す ) int VectorTransform4( VECTOR *Out, float *V4Out, const VECTOR *InVec, const float *V4In, const MATRIX *InMatrix ) ; > MakeScreenを使用する際に例外 _com_error が二回スローされるという事象を確認しています。 ご指摘ありがとうございます 手元でも _com_error が二回スローされるのを確認しました 修正版をアップしましたので、よろしければお使いください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: D3DXVec3TransformCoord互換の関数について ( No.3 )
名前:Stnsllet(解決) 日時:2021/11/05 10:03

ありがとうございます! 提示していただいたコードで無事に望みの値を取ることが出来ました。 またMakeScreenについても例外の発生が無くなったことを確認しました。 ご対応ありがとうございます!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存