2011-09-02 3 views
0

を移動している方向にオブジェクトを回転させる:http://deeplogic.info/project/webGL/WebGLの - それは、この例では

は、どのように私はそれが走行している方向にオブジェクトを回転させることができますか?

+0

私は完全に質問を理解しているかどうかはわかりません - 車輪が地面に沿って進むにつれてホイールが回転しているように見えますか?もしそうなら、私はリンクされた例が2dであることに注意します。それをそのままにするか、3次元を追加したいですか? – Tommy

+0

リンクされた例は、2次元平面上を移動しているに過ぎませんが、3dです。 z軸を中心に回転します。私がしたいのは、長方形がその方向を指し示す方向に動くようにすることです – Sycren

答えて

1

方向(x、y)に移動するオブジェクトのzを中心に回転させるには、Math.atan2(y,x)メソッドを使用できます。ラジアンで角度を返します。 ES2より前のOpenGLのコンベンションは度で作業していましたが、現在はどのようなコードであっても、変換を頂点シェーダにプッシュする必要があります。あなたはおそらく変換したいと思うでしょう。その場合、結果を180度(度数で半円)に乗算し、piで割ります(ラジアンで半円)。

+3

私は三角法で使われているものに疲れています。人、線形代数はそれほど難しくありません。より直接的なアプローチについては私の答えを見てください。 – datenwolf

+0

そして、三角関数(回転行列の作成を含む)が3つの平方根よりも効率的になることは確かではありませんが、私は平方根の計算結果に飽き飽きしています。さらなる正当化:人々は線形代数よりも早く三角法を学ぶ傾向があり、角度を使って作業することは、回転の概念を呼び出す質問に対するより直接的かつ具体的な答えです。 – Tommy

+1

線形代数の前に人が最初に三角法を行うのはまさに問題です。ほぼすべての三角問題は、線形代数で表すことができます。回転の場合、角度には情報が欠けているだけです。ローテーションを表現する唯一の真の方法は、SU(2)グループの要素であり、マトリックス、クォータニオン、またはクォータニオンのサブセットである2D複素数の場合です。そして、「方向を指し示す」の場合は、すでに方向ベクトルがあります。 – datenwolf

3

オブジェクトが方向Dに移動しているとしたら、その方向に垂直なベクトルを見つけるだけでよいとします。場合は、あなたの動きは、あなたが通常の平面N.これは、これらの正規化後の3つのベクトルD、EおよびN.であなたをもたらし

E = D × N 

とDのクロス積を取ることによって、このベクトルEを見つけることができる唯一の1つの平面内にあります回転座標系の基底を形成する。あなたは

D_x E_x N_x 
D_y E_y N_y 
D_z E_z N_z 

は、4×4の均質な1

D_x E_x N_x 0 
D_y E_y N_y 0 
D_z E_z N_z 0 
    0 0 0 1 

にこの行列を拡張する3×3行列の列にそれらを置くことができ、あなたは上にそれを適用するためにglMultMatrixとOpenGLのためにそれを渡すことができますマトリックススタック。

+1

ここでは、オブジェクトがxy平面に沿って移動する特殊なケースでは、座標を切り替えてネガティブにすることでさらに進んで直交を得ることができます。次に、ビルドしている行列の(非公式な)対称性を利用します1つのベクトルのみを正規化する。 – Tommy

+0

@ Tommy:XY平面内のベクトルのクロス積をZと評価した場合、これはまさに何が起きるか見ることになります。 – datenwolf

+0

私はそれを十分に認識しています。特殊なケースは、一般的なケースの議論においてさえ関連している。 – Tommy

関連する問題