ページ 11

モデルを指定した座標を中心に回転するには

Posted: 2011年3月21日(月) 17:12
by RYO
MV1LoadModelで読み込んだ3Dモデルを、指定した座標を中心に回転するにはどうすればいいでしょうか。
MV1SetRotationXYZを使うと、モデルの中心で回転してしまいます。

Re: モデルを指定した座標を中心に回転するには

Posted: 2011年3月21日(月) 17:45
by softya(ソフト屋)
これで出来ると思うのですが、試していませんのでテストをしてみてください。

コード:

MATRIX m1 = MGetTranslate( VGet( 2.0f, 2.0f, 2.0f) );	//移動行列
MATRIX m2 = MGetRotY(rot);	//回転行列
MATRIX mm = MMult(m1,m2);	//行列のかけ算
MV1SetMatrix(ModelHandle,mm);	//モデルに行列を反映

Re: モデルを指定した座標を中心に回転するには

Posted: 2011年3月21日(月) 17:55
by RYO
テストするとモデルが変な場所にずれてしまいました...

Re: モデルを指定した座標を中心に回転するには

Posted: 2011年3月21日(月) 18:11
by softya(ソフト屋)
RYO さんが書きました:テストするとモデルが変な場所にずれてしまいました...
この方法を使うとMV1SetPosition()やMV1SetRotationXYZ()の値はすべて無視されますので、それが原因では無いでしょうか。
それと先程のは実験的なので回転中心はワールドの(0,0,0)です。

任意座標中心だと

コード:

MATRIX mr = MGetRotY(ror);	//回転
MATRIX mv1 = MGetTranslate(VGet(0, 10, 0));  //回転中心からの移動距離
MATRIX mv2 = MGetTranslate(VGet(10, 0, 0));  //回転中心座標
MATRIX mm1 = MMult(mv2, mr);	//行列の掛け算 回転中心に移動して回転する。
MATRIX mm2 = MMult(mm1, mv1);	//行列の掛け算 回転したものから指定距離移動する。
MV1SetMatrix(ModelHandle,mm2);	//モデルに行列を反映
今後のことを考えるなら3Dの行列演算の勉強はされた方が良いですよ。

Re: モデルを指定した座標を中心に回転するには

Posted: 2011年3月21日(月) 18:49
by RYO
>この方法を使うとMV1SetPosition()やMV1SetRotationXYZ()の値はすべて無視されますので、

MV1SetPosition()の値を無視しない方法はないでしょうか。

Re: モデルを指定した座標を中心に回転するには

Posted: 2011年3月21日(月) 18:53
by softya(ソフト屋)
RYO さんが書きました:>この方法を使うとMV1SetPosition()やMV1SetRotationXYZ()の値はすべて無視されますので、

MV1SetPosition()の値を無視しない方法はないでしょうか。
MATRIX mv2 が回転の中心座標ですから、その値ではダメなのでしょうか?
2つ目のコードは回転中心座標、回転角度、回転中心からの距離は全てパラメータとして与えれるようになっています。
逆にMV1SetPosition()が必要な理由が良く分かりませんので説明して頂けると助かります。

Re: モデルを指定した座標を中心に回転するには

Posted: 2011年3月21日(月) 19:00
by h2so5
MV1SetPosition()で設定した数値を使いたいのなら
MV1GetPosition()で得た数値を行列計算に使うという手もあります。

Re: モデルを指定した座標を中心に回転するには

Posted: 2011年3月22日(火) 16:10
by RYO
ありがとうございます。
出来ました!!!!

Re: モデルを指定した座標を中心に回転するには

Posted: 2011年3月22日(火) 16:12
by RYO
解決!押すの忘れてた...