トップページ > 記事閲覧
行列から指定要素のみを取得できる関数の提案
名前:KRNKRS 日時: 2017/05/31 20:51

私は現在、行列からオフセット要素を取得する関数(つまりm[3][0]〜m[3][2]をVECTOR型座標に変換)と、 オフセット要素を除いた純粋な回転行列を出す関数(m[3][n]が単位行列要素になる)を自作しています。 というのも、標準の関数が使用できず(もしくは無く)、行列を用いて移動や回転を行うプログラミングを記述する際に必要となったためです。 例えば、以下スレッドのように、直接カメラ行列を指定した場合にDxLib関数から取得できない場合などです。 参考URL:dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=4127 参考までに、作成した関数とその使用例を記述します。 =========================================================================================================================================================== //行列から座標を取得 VECTOR GetOffset(const MATRIX& mat) { return VGet(mat.m[3][0], mat.m[3][1], mat.m[3][2]); } //行列から回転成分のみの行列を取得 //X,Y,Z軸の回転行列を取得する関数はあるが行列から回転要素のみを取得するものはない? MATRIX GetRotMatrix(const MATRIX& mat) { MATRIX retMat = MATRIX_IDENTITY; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { retMat.m[i][j] = mat.m[i][j]; } } return retMat; } //以下使用例 VECTOR Camera::GetCamPosition() { return GetOffset(MInverse(GetCameraViewMatrix())); } //[平行移動][回転][回転原点][回転原点との距離][回転原点座標の平行移動]を基にカメラを移動、回転 void Camera::SetTransform(const VECTOR& translate, const VECTOR& rotation, const VECTOR& rotateCenter, float toCenterLength, const VECTOR& offset) { MATRIX rotMatX = MGetRotAxis(GetCamVector(VECTOR_X_AXIS), DegToRad(rotation.x)); MATRIX rotMatY = MGetRotAxis(VECTOR_Z_AXIS, DegToRad(rotation.y)); //使用部分 MATRIX rotMat = GetRotMatrix(MInverse(GetCameraViewMatrix())) * (rotMatX * rotMatY); MATRIX zAxisMat = MGetTranslate(VECTOR_Z_AXIS * -toCenterLength); SetCameraViewMatrix(MInverse(zAxisMat * rotMat * MGetTranslate(rotateCenter + offset + translate))); } =========================================================================================================================================================== 個人的にはありそうでなかった関数であるため、あれば有用なのではと思い提案させていただきました。 既に存在する、もしくは似たようなものが既にある場合は申し訳ありません。 ご検討や意見の方、よろしくお願いいたします。
メンテ

Page: 1 |

Re: 行列から指定要素のみを取得できる関数の提案 ( No.1 )
名前:管理人 日時:2017/06/01 03:07

ご提案ありがとうございます、早速行列からオフセット要素と回転要素を取得するための関数を追加してみましたので、 よろしければこちらをダウンロードしてください m(_ _)m http://dxlib.o.oo7.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 http://dxlib.o.oo7.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 http://dxlib.o.oo7.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 http://dxlib.o.oo7.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 http://dxlib.o.oo7.jp/temp/DxLibDotNet.zip // Windows版 .NET用 http://dxlib.o.oo7.jp/temp/DxLibAndroidTest_ARM.exe // Android版 ARM用 http://dxlib.o.oo7.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい) 以下の関数を追加しました // 行列の回転成分を取得する MATRIX MGetRotElem( MATRIX InM ) ; // 行列の平行移動成分を取得する VECTOR MGetTranslateElem( MATRIX &InM ) ; 機能は KRNKRSさんが追加された関数と同じですが MGetRotElem は引数が参照渡しではないという違いがあります ( 参照渡しの方が処理が軽いのですが、MMult や MAdd が参照渡しではないので、とりあえずそれに合わせました 何処かのタイミングで一度に参照渡しに変更しようと思います )
メンテ

Page: 1 |

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

   クッキー保存