• 締切済み

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

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

みんなの回答

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

オブジェクト座標系でZ+に動かしてから、新しい座標をワールド座標系に変換します。 具体的には、以下の処理をします。 1.オブジェクトを原点に平行移動する 2.オブジェクトから見た時の、移動量ベクトル行列を求める 3.オブジェクトが向いている方向の、方向ベクトルを求める 4.2と3を行列演算する 5.4で求めた行列を、1で平行移動したのと逆に平行移動する 最初の平行移動は、オブジェクトのワールド座標系での位置と同じなので、計算は要りません。 原点にあるオブジェクトがY軸に45度回転している時は (x' y' z' 1) = { ( cos45 0 sin45 0 ) ( 0 1 0 0 ) ( -sin45 0 cos45 0 ) ( 0 0 0 1 ) } ( x y z 1 ) となります。 オブジェクトから見ての正面に10進んだ位置は、オブジェクトの現在位置を原点とした時 ( 0 0 10 1 ) ですから、上記の式の「( x y z 1 )」に「( 0 0 10 1 )」を代入して { ( cos45 0 sin45 0 ) ( 0 1 0 0 ) ( -sin45 0 cos45 0 ) ( 0 0 0 1 ) } ( 0 0 10 1 ) を行列計算します。 そして、それをワールド座標系に平行移動します。 平行移動は (x' y' z' 1) = { ( 0 0 0 tx ) ( 0 0 0 ty ) ( 0 0 0 tz ) ( 0 0 0 1 ) } ( x y z 1 ) で行列計算します。 この時のtx ty tzは「移動前のオブジェクトのワールド座標系での座標位置」で、「( x y z 1)」は、その前の行列計算で求めた「( x' y' z' 1)」の事です。 「何を言っているのか判らない」って場合は「行列」と「ベクトル」についての学習が必要です。

関連するQ&A

  • 座標系 三角関数 回転行列

    座標系 三角関数 回転行列 単位円において、θの正方向は反時計回りですがこれって右手系の座標系を採用しているからですか? x,y,zの3軸を考えると以下になってしまって混乱しています。 1.(Z軸が奥向きの場合) Y ↑ | |  --→X この座標系では、時計回りがθの正の方向ですよね? 2.(Z軸が手前向ききの場合)    Y    ↑    |    | X←-- この座標系では、反時計回りがθの正の方向ですよね? 参考書などに書かれている単位円はθの正方向は反時計回りだと認識しているのですが、その場合、2の座標系なんでしょうか? 私は、1の座標系で反時計回りを正にしているように思いました・・・ 回転行列を作ろうと思って考えた結果、自分でも混乱しています。。。 申し訳ないのですが、ご回答よろしくお願い致します。

  • エクセルを用いた3次元座標変換

    3次元座標空間において、座標軸を回転移動させて三つの基準座標点のz座標をすべて0にする方法を教えていただけないでしょうか。 例:(x1,y1,z1), (x2,y2,z2), (x3,y3,z3) →(回転移動)→ (x1',y1',0), (x2', y2', 0), (x3', y3', 0)  よろしくお願いします。

  • エクセルを用いた3次元座標変換

    3次元座標空間において、座標軸を回転・平行移動させて3つの座標点のz座標をすべて0にする方法を教えていただけないでしょうか。 例:(x1,y1,z1), (x2,y2,z2), (x3,y3,z3) →(回転・平行移動)→ (x1',y1',0), (x2', y2', 0), (x3', y3', 0)  また、この3つの座標点以外の座標点についても、 これと同じ回転・平行移動を一括して行う方法があれば教えてください。 よろしくお願いします。

  • 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); }

  • 3次元上にある物体の向きを中心に向かわせたい

    3次元上にある物体の向きを中心に向かわせたい 原点 0,0,0 を中心にした球体面上を回転移動している物体A、 例えば矢印があるとして、これを常に原点の方向を指すためには、 矢印のY軸回転・X軸回転・Z軸回転などをどのように制御すると良いでしょうか。 アングルは正面(Yが垂直 Xが水平 Zは奥行)から見た場合です。 物体Aの座標(x y z)がわかれば、全て導き出せるでしょうか? 2次元ですと、タンジェントの逆関数であるアークタンジェントを使い、 xとy座標がわかれば角度を導き出せるようですが、 3次元の場合もこの組み合わせになるのですか? 座標は原点 0, 0, 0を中心に 上に行くほどYが「減少」 右に行くほどXが「増加」 奥に行くほどZが「増加」 Y減少 ↑ _ Z増加 │/` ├─→ X増加 という形になっています。(前回の質問: http://okwave.jp/qa/q5954803.html から引用) 以上宜しくお願い致します。

  • x,y,z…z??

    どのカテゴリに質問捨て場良いのか迷いましたが、数学のほうに質問させていただきました。 ファイナルファンタジーや ほかのゲームを見ていて気づいたのですが、 マップなどの画面で、X軸、Y軸、Z軸というのを発見しました。 XとYは座標等で習ったので 大体わかるのですが、 Z軸というのがわかりません 横に動かせばXの数字が増えて、縦に動かせばYの数字が増えますが どの方向に動かしてもZの数字が増えません。 Z軸というのは どの方向(?)なんですか?

  • 空間の座標について

    空間図形の座標なんですが、 進行方向に対して、左右方向がX軸 進行方向をY軸、深度をZ軸としたX-Y-Z空間があります。 X-Y平面でY軸を0とした時の角度をβ X-Y平面とZ軸と方向との角度をα 原点から(x、y、z)までの距離をLとする このとき、点(x、y、z)をもとめるにはどうしたらよいのでしょうか? ちなみにx=y=zは0ではありません できれば三角関数を使った解法を教えてください ちなみに (x、y、z)=(Lsinβ、Lcosβsinα、Lcosβsinα) という答えらしいんですが、さっぱりわかりません・・ って、うまくかけてない・・・

  • 3次元座標の求め方

    3次元座標の求め方 原点 0,0,0 を中心にした球体面上の正面から見た頂点座標で、 回転による移動後の座標の求め方を知りたいです。 例えば、球面の半径が 100 で、頂点の座標 x1, y1, z1 が 100, 0, 0 にある場合、 Y軸に対してπ/2 rad (90度)回転した座標 x2, y2, z2 は 0, 0, -100 になると思うのですが、 この新たな3つの座標 x2, y2, z2 を導くにはどのように計算しているのでしょうか。 平面上の円運動のように cos sin の組み合わせ等で導き出せるのでしょうか。 x1, y1, z1 から、 Y軸に対してr回転 した場合の各 x2, y2, z3 の出し方 X軸に対してθ回転 した場合の各 x3, y3, z3の出し方 Z軸に対してΘ回転 した場合の各 x4, y4, z4 の出し方 のような形で、導くための計算を順にお教えいただけると嬉しいです。 最終的には、元座標 x, y, z をY軸にr、更にそこからX軸にθ、更にそこからZ軸にΘで X, Y, Z になる、といった形で求められるようになりたいと思っています。 座標は原点 0, 0, 0を中心に 上に行くほどYが「減少」 右に行くほどXが「増加」 奥に行くほどZが「増加」 Y減少 ↑ _ Z増加 │/` ├─→ X増加 という形になっています 自分のわかる限りで質問内容を細かく記述したつもりですが、 数学の知識に乏しいので、記号などの使い方や説明の不備があるかもしれません。 何か不足があった場合には補足させて頂きます。 以上宜しくお願い致します。

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

    こんにちは。お知恵をお借りしたく質問致します。 プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。 ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。) 図のように、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軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • UNITYのカメラアングル

    unity 3dで質問です。 新規でプロジェクトを作るとカメラはデフォルトで 右がX軸プラス、上がY軸プラス、奥行きがZ軸プラス になっていて、座標位置がX0、Y1、Z-10になっています。 Cubeなどのゲームオブジェクトを新規で作ると 座標位置がX0、Y0、Z0に置かれ、後ろから見ているような アングルになると思うのですが、なぜ、デフォルトがこのような仕様なのでしょうか。 一般的にゲームを作っていく場合、下記のどちらになりますでしょうか。 また、皆さんはどちらで作られますでしょうか。 ・Z軸プラス方向にオブジェクトを配置していき、後ろからのアングルのまま作っていく ・カメラを反転させ、Z軸プラス方向からマイナス方向のアングルに変更し、 Z軸マイナス方向にオブジェクトを配置し作っていく 何か勘違いや考え方が間違っていたら教えてください。

専門家に質問してみよう