行列を単位行列に近づける

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
リュック

行列を単位行列に近づける

#1

投稿記事 by リュック » 16年前

処理部分でもしもMatが変化していたら徐々に単位行列に近づくとif文などで書きたいのですが
できるのでしょうか?

D3DXMATRIX Mat;
D3DXMatrixIdentity(&Mat); // 起動したときのみ

//処理部分
if(Mat._11 < 1) Mat._11 += 0.01f;
if(Mat._11 > 1) Mat._11 -= 0.01f;
///
みたいな感じで書けるかとは思うのですがもう少し効率がよくは書けないでしょうか?

Justy

Re:行列を単位行列に近づける

#2

投稿記事 by Justy » 16年前


>みたいな感じで書けるかとは思うのですが

 ただ単に行列Aから行列Bにしたい、そしてその中間の状態については
最終的に行列Bに変化するのであれば一切気にしない、ということでしたら
その方法でも書けますね。

 どういう意味での効率なのかにも依りますが、その「処理部分」というのを
関数化したり、ループ化するなりすれば効率も良くなるかもしれません。
 勿論、0.01という変化量ついては再考の余地有りですが。 

 D3DXMATRIX型は mだとか m.m[j]のように配列としても書けますので、
これを forループで順繰りに処理してもいいですし。



 しかし、効率云々の前にその“中間の状態については一切気にしなくていい”のでしょうか?

 行列から行列への“滑らかな(位置や回転が綺麗に)補完”という意味であれば、
行列の 16個の float1つ1つを個別に対応していくこの方法ではできません。

 あくまで行列は移動・回転・スケーリングなどを行った結果の状態を表すものなので、
行列そのままでは綺麗に補完することは(条件によって異なりますが)困難です。
 行列の元になった移動・回転・スケーリングなどの情報を補完して行列を再構築した方が
簡単です。

 例えば、(単位行列を含む)移動と回転しかしていない行列AとBがあったとして、
AからBに滑らかに補完する場合、位置と回転とを別々に考慮します。

 行列しか情報がないので、その行列から位置と回転の情報を取り出します。

 位置はそれぞれの行列から位置情報を取り出し、補完をした位置 Pを求めます。
 回転はそれぞれの行列をクォータニオン D3DXQUATERNION型に変換し、
D3DXQuaternionSlerp()を使って球面補完したクォータニオン Qを求めます。

 後は Pと Qを行列に変換し合成すれば完了です。


 効率という面で言えば、行列の元になった移動・回転などの情報を覚えていれば
わざわざ行列から取り出さなくても済みますので、そのあたりの処理は省けます。

閉鎖

“C言語何でも質問掲示板” へ戻る