2012-02-09 42 views
0

四元数で回転されたWebGLコンテキストでオブジェクトを取得しました。今私は現在のマウスの位置に応じてx軸の周りに回転したいと思います。これどうやってするの?私はglMatrixライブラリを使用しています。軸に沿ってクォータニオンを回転する

+0

なぜquaterionを使用しますか?特にこのシナリオでは、行列がはるかに簡単になります(CPUも少なくなります)。 – Skizz

+0

あなたはどのように考えますか? X軸の周りの四元数の回転は、8倍、2倍、および2回の減算をとる。 4×4行列に対する同じ演算は、16の乗算と8つの加算である。クォータニオンの数学はいつもより高速になります。行列の数学を使うには、とにかく行の下にある行列に変換することが強制されるのが唯一の理由です(シェーダに渡す) – Toji

答えて

2

glMatrixは(現在)四元数変換の方法にはほとんど含まれていません。ごめんなさい。おそらく、追加するのは悪い考えではないでしょう。

オンラインでは、これらのことについての参考資料を見つけることができます。たとえば、this pageには基本的な四元数演算の良い例がいくつかあります。一方、すべてのあなたが探してはXI 周りの回転であれば、これはトリックを行いますを考える:(先に未テストコードを注意してください。これは、私がリンク先のページのアルゴリズムのちょうど速い最適です!)

/** 
* Rotates a quaternion by the given angle around the X axis 
* 
* @param {quat4} quat quat4 to rotate 
* @param {number} angle Angle (in radians) to rotate 
* @param {quat4} [dest] quat4 receiving operation result. If not specified result is written to quat 
* 
* @returns {quat4} dest if specified, quat otherwise 
*/ 
quat4.rotateX = function (quat, angle, dest) { 
    if (!dest) { dest = quat; } 

    // NOTE: I really have no idea what this is for, the guy on the linked page seemed to think it was necessary, though. 
    angle *= 0.5; 

    var qax = quat[0], qay = quat[1], qaz = quat[2], qaw = quat[3], 
     qbx = Math.sin(angle), qbw = Math.cos(angle); 

    dest[0] = qax * qbw + qaw * qbx; 
    dest[1] = qay * qbw + qaz * qbx; 
    dest[2] = qaz * qbw - qay * qbx; 
    dest[3] = qaw * qbw - qax * qbx; 
}; 

その間に、gl-matrix github pageに問題を追加して、役に立つと思われる操作をリクエストしてください。

+0

ありがとうこの答えとリンクのために! glMatrixのquat4には、私が今追加した答えのように、これを簡単にするための乗算関数があります。 – Grumdrig

+0

ああ、角度を2で割る必要があるのは、あなたがリンクしたページの冒頭のところで述べたように、軸周りの回転の四元子が回転角の半分のcosとsinで表されるからです。 – Grumdrig

0

このトリックを行う必要があります:あなたが使用できる

quat4.rotateX = function (quat, angle, dest) { 
    if (!dest) dest = quat; 
    quat4.multiply(quat, [Math.sin(angle/2), 0, 0, Math.cos(angle/2)]); 
} 

、例えば、

quat4.rotateX(myQuaternian, Math.PI/4); 

(YとZ軸周りの回転は、第二にそのsin用語を移動することによって行うことができますまたは3番目のスロット)

関連する問題