トップページ > 記事閲覧
3D回転と移動
名前:ゼータ関数 日時: 2019/05/05 22:45

こんにちは。3Dプログラム初心者です。 [行いたいこと] 1. MV1SetPosition のような、dxlibの絶対座標系におけるxファイルの、座標による位置決定 2. MV1SetRotation のような、xファイルが所有する座標系3軸各々に関しての、回転角(ロール、ピッチ、ヨー)による決定 なお、1, 2を行なった際には、xファイルが所有する座標系はxファイルと共に移動、回転する これらを独立して行えるようになりたいのです。 以下のサイト(https) dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=past&no=1849 や、MV1SetMatrix, MV1SetRotationZXAxis 関数を使って色々と試しましたが、挙動がよくわかりません。 MV1SetMatrix関数に関しては、MV1SetPosition関数の動きが無視されてしまうようで、、。 MV1SetRotation関数に関しては、xファイルが所有するx軸に関してはそのまま動き、y,z軸に関しては絶対系と並行なベクトルを軸にその場回転するようです。 ご教授願います。
メンテ

Page: 1 |

Re: 3D回転と移動 ( No.1 )
名前:管理人 日時:2019/05/06 03:51

> [行いたいこと] > 1. MV1SetPosition のような、dxlibの絶対座標系におけるxファイルの、座標による位置決定 > 2. MV1SetRotation のような、xファイルが所有する座標系3軸各々に関しての、回転角(ロール、ピッチ、ヨー)による決定 MV1SetPosition と MV1SetRotation を使用するのでは駄目なのでしょうか? > MV1SetMatrix関数に関しては、MV1SetPosition関数の動きが無視されてしまうようで、、。 MV1SetMatrix で設定する行列を代わりに構築するのが MV1SetPosition や MV1SetRotation などの関数なので、 MV1SetMatrix で直接行列を設定する場合は MV1SetPosition や MV1SetRotation で設定した値は無視されます
メンテ
Re: 3D回転と移動 ( No.2 )
名前:ゼータ関数 日時:2019/05/06 12:06

回答ありがとうございます。 素直な記述でMV1SetRotationでその場回転させたいのですが、xファイルが所有する座標系におけるx軸に関しては回転が有効で、 それのy,z軸は、xファイルが所有する座標系の原点を中心に、dxlibの絶対系のy,z軸と並行なベクトルに関しての回転がされてしまいます。 主要部 while(1) { MV1SetRotationXYZ(handle, convRad(20, rolate, 0)); } convRad関数は度数法で指定できるようにした自作関数 rotateは別スレッドで、0 to 360の値を何度かずつで変動する このように記述すると、やはりxファイルが所有する座標系の原点を中心に、dxlibの絶対系のy軸と並行なベクトルに関して回転します。 handleが長方形なら、円錐を描いて回っているような感じです。 このような記述で、xファイルが所有するy軸に関して回転する、 すなわち傾いた状態(20という変数)で、円盤を描くように回って欲しいのです。 xファイルはblenderで作っており、Right-Handedにしても同じ状態です。
メンテ
Re: 3D回転と移動 ( No.3 )
名前:ゼータ関数 日時:2019/05/06 13:18

訂正 handleが 長方形 ではなく 直方体 です。
メンテ
Re: 3D回転と移動 ( No.4 )
名前:管理人 日時:2019/05/06 20:34

恐らく各軸の回転の順番の問題だと思います MV1SetRotationXYZ で設定する行列は MV1SetMatrix を使用すると以下のようになります MV1SetRotationXYZ( ModelHandle, VGet( RotX, RotY, RotZ ) ) ; ↓ MV1SetMatrix( ModelHandle, MMult( MMult( MGetRotX( RotX ), MGetRotY( RotY ) ), MGetRotZ( RotZ ) ) ) ; 更に MV1SetPosition の効果も合わせる場合は以下のようになります MV1SetPosition( ModelHandle, VGet( PosX, PosY, PosZ ) ) ; MV1SetRotationXYZ( ModelHandle, VGet( RotX, RotY, RotZ ) ) ; ↓ MV1SetMatrix( ModelHandle, MMult( MMult( MMult( MGetRotX( RotX ), MGetRotY( RotY ) ), MGetRotZ( RotZ ) ), MGetTranslate( VGet( PosX, PosY, PosZ ) ) ) ) ; そして、X軸回転 → Y軸回転 → Z軸回転の場合は MV1SetMatrix( ModelHandle, MMult( MMult( MMult( MGetRotX( RotX ), MGetRotY( RotY ) ), MGetRotZ( RotZ ) ), MGetTranslate( VGet( PosX, PosY, PosZ ) ) ) ) ; ですが、X軸回転 → Z軸回転 → Y軸回転の場合は MV1SetMatrix( ModelHandle, MMult( MMult( MMult( MGetRotX( RotX ), MGetRotZ( RotZ ) ), MGetRotY( RotY ) ), MGetTranslate( VGet( PosX, PosY, PosZ ) ) ) ) ; となり、Y軸回転 → X軸回転 → Z軸回転の場合は MV1SetMatrix( ModelHandle, MMult( MMult( MMult( MGetRotY( RotY ), MGetRotX( RotX ) ), MGetRotZ( RotZ ) ), MGetTranslate( VGet( PosX, PosY, PosZ ) ) ) ) ; となり、Y軸回転 → Z軸回転 → X軸回転の場合は MV1SetMatrix( ModelHandle, MMult( MMult( MMult( MGetRotY( RotY ), MGetRotZ( RotZ ) ), MGetRotX( RotX ) ), MGetTranslate( VGet( PosX, PosY, PosZ ) ) ) ) ; となり、Z軸回転 → X軸回転 → Y軸回転の場合は MV1SetMatrix( ModelHandle, MMult( MMult( MMult( MGetRotZ( RotZ ), MGetRotX( RotX ) ), MGetRotY( RotY ) ), MGetTranslate( VGet( PosX, PosY, PosZ ) ) ) ) ; となり、Z軸回転 → Y軸回転 → X軸回転の場合は MV1SetMatrix( ModelHandle, MMult( MMult( MMult( MGetRotZ( RotZ ), MGetRotY( RotY ) ), MGetRotX( RotX ) ), MGetTranslate( VGet( PosX, PosY, PosZ ) ) ) ) ; となります、X,Y,Z軸の回転の順番によって結果が大きく異なってきます どれかの組み合わせでゼータ関数さんの意図する回転になると思いますので、よろしければお試しください m(_ _)m
メンテ
Re: 3D回転と移動 ( No.5 )
名前:ゼータ関数 日時:2019/05/09 12:17

回答ありがとうございます。 一つは回転の順番による問題でした。ありがとうございます! 提示していただいた記述は、実際に回転させて検証もしましたが、順番が逆だと考えます。 X軸回転 → Y軸回転 → Z軸回転の場合は 数式 Rz * Ry * Rx * vector ← 標準で MV1SetRotationYZX のような、内部系の軸周りの回転の順番があったら良いなと思います。 そしてもう一つ、問題に当たりました。 従来通り、位置の指定も独立にできて、 xファイルをYZXの順で回転させたあと、その内部系の傾きを保持したまま、 ZXYの順で回転させる必要が出てきました。 どのように記述すればいいのでしょうか?
メンテ
Re: 3D回転と移動 ( No.6 )
名前:ゼータ関数 日時:2019/05/09 14:42

すみません。 自己解決して達成しました! 行列乗算するだけでした! ありがとうございます!
メンテ

Page: 1 |

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

   クッキー保存