2016-09-30 22 views
0

私の目標は、ユーザーが3Dモデルをアップロードしてウェブブラウザを使用して配置できるようにすることです。これを行うために、私はBabylonJS-&をうまく使っています。その後、ユーザーは、Webブラウザを使用して設定したのと同じポジショニングでネイティブアプリで同じモデルを表示できるようになります。ネイティブアプリに使用しているフレームワークはOpenSceneGraph(OSG)です。私が持っている問題は、OpenSceneGraphがBabylonJSで起こっていることを正しく映し出すように、ローテーションを正しく動かすことができないということです。オイラー角の回転を軸+角度に変換

私は、ウェブサイトのユーザーが理解しやすいように(たとえば、X軸周りに90度、Y周りに180度、Z軸周りに0度、たとえばZ軸周りに回転させるなど)、オイラー角を使用しています。 rotation = new BABYLON.Vec3(90,180,0))。しかし、OSGはOpenGL glrotate()関数を使用して回転軸と回転角度が必要です。これを行うには、オイラー角からクォータニオンを作成するためにBabylonJSを使用しています。

function getAxisAngle(){ 
    var q = BABYLON.Quaternion.RotationYawPitchRoll(m.rotation.y,  m.rotation.x, m.rotation.z),s,r={}; 
    /*Convert quaternion to axis+angle*/ 
    if(q.w > 1){ 
     q = q.normalise(); 
    } 
    r.angle = BABYLON.Tools.ToDegrees(2 * Math.acos(q.w)); 
    s = Math.sqrt(1-q.w*q.w); 
    if(s < 0.001){ 
     r.ax = q.x; 
     r.ay = q.y; 
     r.az = q.z; 
    }else{ 
     r.ax = q.x/s; 
     r.ay = q.y/s; 
     r.az = q.z/s; 
    } 
    return r; 
} 

http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm私はBJSとOSGの基本的な違いを実現BJS座標系左利きであることである;そして、私はこのページのJavaの例をオフに基づいて書いた関数を使用してOSGは右利きです。私はフェイスワインディングをClockwiseに設定してOSGを左手にしました。私のモデルのz軸を-1倍にスケーリングします。

私は一度に1軸を分離すれば基本レベルで動作します。例えば私はy軸の周りを回転するだけです。他の軸の周りを回転しないでください。うまく見えます。しかし、同時に2つまたは3つのオイラー角を試して組み合わせると、私はそれをOSGで同じに見せることはできません。

オイラーアングルは推奨されていません。回転が各軸に適用される順序が重要な理由があります。これは考えられる原因ですか?

+0

ジンバルロックのためにクォータニオンをオイラーアングルに対して使用することの利点の違いに精通している一方で、クォータニオンを一端で使用し、反対側にオイラーアングルを使用しているので推測しています。アプリケーションでオイラー角を使用して回転軸を複数回回転させ、ジンバルロックが発生している場合、回転が停止します。あなたの軸で回転を行うためにオイラー角を使い続けることを望むなら、ジンバルロックを防ぐためにそれらを拘束する必要があります。例えば[-89.99、89.99]。 (...続き) –

+0

(...続き)ジンバルロックの理由は、90度またはPI/4が直角または直交であるためです。正弦(90)または正弦(PI/4)= 1、余弦(90)または余弦(PI/4)= 0であり、接線=正弦/余弦のため、ここでの接線は0による除算のため未定義です。 X軸のオブジェクトが90、次にYまたはZのいずれかが90または-90の2つの軸がインターロックされ、2つのロックされた軸のいずれかから再び回転すると、どの軸を回転す​​るかを決定することはできません。 (...続き) –

+0

(...続きを読む)このビデオをチェックすると、クォータニオンをはっきりと理解することができます。多分数学的ではなく、少なくとも視覚的には分かります。 https://www.youtube.com/watch?v=zc8b2Jo7mno –

答えて

0

私の意見では、OSGを左利きにするのではなく、あなたの回転角度の "論理的"意味を翻訳して、OSGに使用する方法を適用してください。

osg :: PositionAttitudeTransform(またはMatrixTransform)の下にロードされたモデルを配置し、ユーザーに公開する2つの回転角度に対して2つのクォータニオンを連結して、正しい回転(姿勢)を計算します。例えば
、あなたはX軸周りの回転として「ピッチング」、およびYを中心に、ような何か「見出し」を検討している場合:

osg::Quat attitude = osg::Quat(pitchAngle, osg::X_AXIS) * osg::Quat(headAngle, osg::Y_AXIS); 
transform->setAttitude(attitude); 

をあなたは正しい結果を得るために、角度の符号を反転する必要がある場合があります(左から右へ渡す)。

+0

あなたの提案をお寄せいただきありがとうございます。 – Reece

関連する問題