• ベストアンサー

DirectX 9.0 オブジェクトの移動

 キー入力でローカル座標のZ軸上を前進するオブジェクトがあったとして、そのオブジェクトをローカルで回転させて、向きを変え、次にキー入力で前進させる時に、グローバルのZ軸に向かって前進してしまいます。  グローバルのZ軸に向かって前進するのではなく、オブジェクトの向きが変わったらそのローカルのZ軸に対して前進するようにするにはどうすればいいのでしょうか。    初歩的な質問でごめんなさい。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.2

>上、下キーを押すと、jiki構造体のm_vTrans.zが移動量分加算、減算し。 XZ平面上を動かしていいのですよね? D3DXVECTOR3 idv(0.0f, 0.0f, 1.0f); D3DXVECTOR3 vec; D3DXVec3TransformCoord(&vec, &idv, &matRot); // 先にmatRotができているものとする if (上が押された) { m_vTrans += vec; } else if (下が押された) { m_vTrans -= vec; } ※雰囲気だけ見てください。エラーとか言われても困る(笑

Giuseppe
質問者

お礼

 度々の回答本当にありがとうございます。 お陰でうまくいけました。  ただ、同じことをやっているのに自分なりの方法だとちゃんと動きません。まぁ、これはちゃんとトレースすれば気づくことですよね。  すみません。初歩的なことでお手数を御かけしました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#30727
noname#30727
回答No.1

次のオブジェクトの座標=今のオブジェクトの座標+移動ベクトル(0, 0, 移動速度)という事ですよね? 移動ベクトルにもオブジェクトの回転行列を掛けて回転させてやれば、同じ方向の移動ベクトルになります。 移動がXZ方向だけなら、オブジェクトのY軸回転成分だけで回転させる必要があります。

Giuseppe
質問者

補足

回答ありがとうございます。やってみたものの何度やってもうまくいきません。 要するに D3DXMatrixRotationY( &matRot, Jiki.m_vRot.y ); をした直後に D3DXMatrixRotationY( &matTrans, Jiki.m_vRot.y ); をすればいいんですよね? D3DXMATRIX matTrans,matRotはローカルで宣言し、Jiki構造体の中で、 D3DXVECTOR3 m_vTransやm_vRotを宣言しています。 上、下キーを押すと、jiki構造体のm_vTrans.zが移動量分加算、減算し。右、左キーでm_vRot.yが加算減算するようにしています。 jiki構造体内のD3DXMATRIX matにmatRotとmatTransと大きさを掛け合わせて、それを最後にカメラや射影と合成しています。 説明がうまくできなくてすみません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++でObjectの正面(Z+)に進む処理

    Objectを座標で動かす際、Z+に動かすとワールド座標でZ+に移動します。 ワールドでの移動はObjectのY軸に回転がかかっている状態でも動く方向は同じです。 それを例として、ObjectにY軸45度回転がかかっていたら そのObjectnの正面である、ワールド座標でZとXの間を斜め移動するようにしたいです。 三角関数などを利用すればできると思うのですがどうすればできるのか分りません。

  • GLで座標を変えて回転させたい

    openGLで glRotatef(angle, 0.0, 0.0, 1.0); でz軸について回転させたのですが、 オブジェクトの点の座標は変わっていませんでした。 オブジェクトの座標自体を変更してZ軸について回転させたいのですが,できますでしょうか. 分かりにくい質問かもしれませんが,お願いします。

  • openGLの回転の仕組みが分からなくて、困っています

    openGL初心者です。描画関数で以下のような書き方でx軸、y軸、z軸それぞれに角度を与えてオブジェクトを描画しているのですが、意図した角度に回転してくれません。 一応自分の認識では、openGLでは以下のような書き方をすると、まずオブジェクトの描画がされて、次にz軸の回転→y軸の回転→x軸の回転と、処理の順番とは逆に計算が行われると知ったのですが、まずその認識は正しいでしょうか? そこで、実際にx、y、z軸にそれぞれ角度を与えてオブジェクトを回転させてみるのですが、どうも意図した回転にならないのです。 例えばz軸に90度の値を与えて、オブジェクトを横に倒したとします。 まず、その状態でローカル座標系のx軸とy軸がz軸を中心に90度回っていると思っています。 その後、y軸に90度の値を与えても、ローカル座標系のy軸を中心に回らず、まるでワールド座標系のy軸を中心に90度回りまわっているように見えます。また、x軸も同様にワールド座標系のx軸を中心に90度回ります。 そこで、ワールド座標系で回るのかと思い、今度は、ニュートラルの状態から、y軸を90度回します。ローカル座標ではx軸、z軸がy軸を中心に90度回ると思います。次にx軸に対して、角度を与えてやると今度はローカル座標系のx軸を中心にまわるのです。 何故このような回転をするのかイメージできません。。どなたか回答いただけませんでしょうか? それと本当にやりたいことは、オブジェクトがどのような姿勢で回転していても(ローカル座標系がどうであれ)ワールド座標系のx、y、z軸を中心に回転させたいのですが、宜しければその辺も合わせて教えて頂けたら幸いです。 (数学の知識も乏しいので、数式がちゃんとあるのなら、その名前を教えていただければ直幸いです。) 乱文失礼します。 public void display(GLAutoDrawable drawable) { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gluLookAt((double) 0.0f, (double) 0.0f, (double) 5.5f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 1.0f, (double) 0.0f); gl.glEnableClientState(GL.GL_VERTEX_ARRAY); gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glRotatef(AngleX, 1, 0, 0); gl.glRotatef(AngleY, 0, 1, 0); gl.glRotatef(AngleZ, 0, 0, 1); // オブジェクト描画 draw(gl); gl.glDisableClientState(GL.GL_COLOR_ARRAY); gl.glDisableClientState(GL.GL_VERTEX_ARRAY); }

  • オブジェクトの回転について

    FlashCS5 ActionScript3.0を使っています。 Flash上で、MovieClipでオブジェクトを作り、それをStage上で回転させたいのですが、 rotationプロパティで何度回転させるかはわかるのですが、 どこを基準に(どこを回転軸に)の、基準点の設定方法を教えていただけないでしょうか。 3Dではなく、平面です。 (たとえばX座標=100, Y座標=250を起点に回転させる場合など) 以上、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 航空機の旋回のシミュレーション

    クォータニオンや行列などを用いて、航空機の旋回を表現しようと考えています。 航空機はヨー、ピッチ、ロールの3軸の旋回をしますが、常に自身のローカル座標軸を軸として回転します。 例えば、水平飛行の状態でヨーイングする場合はy軸を軸として旋回しますが、90度ローリングした状態でヨーイングする場合は、自身のローカル座標のy軸、即ちワールド座標のx軸を軸として旋回します。 また、水平飛行の状態でローリングする場合はz軸を軸として旋回しますが、90度ヨーイングした状態でローリングする場合は、ワールド座標のx軸を軸として旋回します。 同時に複数の軸で旋回を行うこともありますが、1回当たりの旋回角は微小で、かつ毎回ローカル座標の更新が行われるため、回転行列やクォータニオンを掛ける順序はどうでもいいものとみなせます。 現在の航空機の向きと姿勢を表すオイラー角(Pitch,Yaw,Roll)と、自身のローカル座標を基準とした旋回角(α,β,γ)が与えられたとき、旋回終了後の航空機の向きと姿勢はどのように表されるでしょうか。 なお、航空機の向きと姿勢はオイラー角ではなく、向きベクトルと回転角を用いた表現でも構いません。 回答よろしくお願いします。 問題が上手く表現できておらず、解りづらい箇所があるかもしれませんが、その場合は一言頂ければ補足します。

  • 3次元での回転による座標変換

    3次元での回転による座標変換に関して質問があります. X軸,Y軸,Z軸の直交座標系があるとします. この座標系において,ある位置ベクトル(a1,b1,c1)がX軸,Y軸,Z軸と成す角度は,θx,θy,θzは,ベクトルの内積から算出可能だと思います. θx=a1/sqrt(a1^2+b1^2+c1^2) θy=b1/sqrt(a1^2+b1^2+c1^2) θz=c1/sqrt(a1^2+b1^2+c1^2) X,Y,Zの直交座標系を回転させて,この位置ベクトルの向きを基準としたX'軸,Y'軸,Z'軸による新しい直交座標系を設定するには,どのようにすればよいでしょうか? θx,θy,θzと各軸での回転角度は違うものという認識でいいのでしょうか? 元の座標系において,各軸回りに順番に回転させればいいかと思うのですが,どうもイメージがつかみきれません. よろしくお願い致します.

  • オイラー角回転後座標系の回転について

    オイラー角で回転させた座標系を作成。 その座標系を更に回転させた場合の、 オイラー角を求めたいのですが、上手く行きません。 そこで質問させて下さい。 【やりたい事】 (1)まずは、右手系座標系AをZYXオイラー角(φ,θ,ψ)で回転した座標系A'を作成する。   1.最初にZ軸周りにφ回転   2.Y'軸(Y軸をZ軸周りにφ回転したもの)周りにθ回転   3.X''軸(X軸をY'軸周りにθ回転したもの)周りにψ回転 (2)次に回転後座標系A'を回転前座標系AのX軸周りにβ回転したモノを座標系A''とする。   座標系A’’のZYXオイラー角を求めたい。   (AをA''に一致する様に回転した時のZYXオイラー角を求めたいです。) 上記の様な角度は算出できるのでしょうか? 説明が分かりづらく申し訳御座いませんが、 ご回答何卒よろしくお願い致します。

  • 3DCG MAYA 回転軸について

    いつもお世話になっております。 3DCGソフト MAYAについて質問です。 仕事で歯車が回るアニメーションを作成しているのですが、 歯車とシャフトの向きが傾いており、回転軸が歯車の穴、シャフトに対して平行でないので 回転した際に変な回転になってしまいます。 (歯車とシャフトが傾いているのは正常です) 座標系をローカル座標系にすれば直ると思っていたのですが、 どこにあるのかがわかりませんでした。 (ワールド座標系、オブジェクト座標系などは弄ってみたのですが駄目でした) 傾いた回転物をその傾きに合う様に回転させるには、 どうすれば良いのでしょうか? 回答のほう、よろしくお願いいたします。 使用ソフト:MAYA2016 歯車データ:ライノセラスで作成したデータをMAYAにインポート(ポリゴンデータ)

  • 回転した座標軸と一致させるための回転軸と角度の算出

    こんにちは。お知恵をお借りしたく質問致します。 プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。 ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。) 図のように、xyz座標を回転してXYZ座標の向きに一致させたいと考えています。 また、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数があるので、それを活用しようと考えています。α,β,γはコサイン値(方向余弦)です。回転方向は、ベクトルの向きに時計回り…右ネジの法則みたいな感じです。 x軸から見たXの角度(θxX), y軸からのX(θyX), z軸からのX(θzX) 同様にx軸から見たY(θxY),θyY,θzY、θxZ,θyZ,θzZ といったように、それらの角度(コサイン値)は分かっています。 (=xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっている。) z軸とZ軸の外積を取ったベクトルを回転軸として、θzZが分かっているのでその角度で回転することでZ軸は一致しますけど、XY軸は合いません。(当然ですが…) そのXY軸を合わせるためにまた回転するというのも遠回りで、任意の軸1本を中心に何度か回転するだけ(上記関数を1度使用するだけ)で、必ず向きが一致する解があると思うのですが、その任意軸と角度を算出する方法が分かりません。 一般にどういう計算をするのでしょうか。アドバイスいただければ幸いです。 なお、上記関数を用いない方法でも構いません。 「X軸(Y軸、Z軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • UCS座標の回転について

    AutoCAD LT2016を使用しています。 水平垂直でない図形(45度などに傾いた図形)に対して作図を行う場合よく、UCS座標を、ワールドでなくオブジェクトを選択して、作図したい傾いた線分などを選択して、座標を回転させるのですが。 下記のURLのようなイメージです。 http://www.g-hokuto.jp/autocad/auto007002.html 添付した画像のように一発で、思い描いた通りの座標になればいいのですが、たいがいはX軸とY軸が逆転していたり、軸の正負の向きが逆転していたり、4通り?の座標のいずれかがおみくじのようにランダムに表れてしまいます。 そういう時は添付した画像のように線分で四角形を仮に書いて、それぞれの線分を何度もクリックして望んだ座標の向きになるまで何度もコマンドを繰りかえしています。 確実にUCS座標を思った向きにする方法。またはX-Y軸だけ入れ替えるコマンドX軸(Y軸)の正負の向きだけ変えるコマンドなどありますでしょうか。