3

私は 4 年生のコンピューター エンジニアリングの学生で、Android 開発の経験があります。

私は、3D コンポーネントを含むアプリケーションで作業しているため、回転できる必要があります。私はアンドロイドリソースサイトで例を見ていました。

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html

この例では、z 軸を中心とした回転については説明していません。回転にクォータニオンを使用してみましたが、z 軸を中心とした回転を取得する方法がわかりません。

何かを回転させると、軸は同じ (x、y) ではなくなります。

オブジェクトの周りを回転できるようにする方法を学ぶのを手伝ってくれる人がいるかどうか疑問に思っていました. 上記の例のように、z 軸の周りにも。私はすでに約 24 時間を検索してこれを理解しようとしています。

より大きな問題は、y 軸を中心に 90 度回転すると、次の回転 (タッチスクリーン上で垂直に移動) が z 軸を中心にする必要があることをどのように検出できるかということです。

前もって感謝します。

4

4 に答える 4

1

xAngleとyAngleを現在のマトリックスに追加します。

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]);
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]);
gl.glMultMatrixf(matrix, 0);
于 2012-01-13T14:55:18.430 に答える
0

オブジェクトを回転させる代わりに、カメラを中心を中心に回転させることもできます。

于 2011-01-26T13:39:36.353 に答える
0

あなたの質問は正しくありません。「何かを回転すると、軸は同じ (x,y) ではなくなるので、どの軸でどれだけ回転するかをどうやって調べることができますか?」と尋ねないでください。軸?」グローバル x を中心とした回転は、オブジェクトのローカル x 軸を中心とした回転ではなく、常にグローバル x を中心とした回転である必要があります。現在の状態に応じて異なる方法で回転するのではなく、概念的に回転しているものを変更するだけです。

まず第一に、おそらく rotX、rotY、rotZ を格納し、glRotatef を呼び出して回転を適用しますか? それはあなたがやりたいことには十分ではありません。あなたがやっていることは、オイラー角による向きを記述していることです。常にジンバル ロックが発生します。これは、軸の 1 つの値によって他の 2 つの軸が同じ軸に変わる場所です。そのため、自由度が失われます。適切な説明については、記事を参照してください。

OpenGL コーダーとしては非常に満足できるので、代わりに、オブジェクトの向きを M という行列として直接格納していたとします。回転を実現するために適用する行列として、回転を格納します。角度や軸の明確な概念はありません。

x を中心に回転させたいとします。x 軸を中心に適切な回転行列を生成し、それを R と呼びます。このような行列は、OpenGL が glRotatef(angle, 1, 0, 0) を実行するために内部的に構築するものです。

次に、実際には 2 つのオプションがあります。M を MR に置き換えるか、M を RM に置き換えます。行列の乗算は可換ではないため、それらは同じではありません。OpenGL マトリックス スタックを使用して 6 を左に移動してから 40 度回転すると、40 度回転してから 6 を左に移動する場合とは異なる結果になります。

この場合、R は目的語なので、MR は後乗算で、RM は前乗算です。行列の乗算は、ベクトルに適用されると、2 番目の行列を適用してから最初の行列を適用するのと同じ効果を持つ行列を作成します。したがって、後置乗算すると、あたかも新しい回転でオブジェクトを回転させ、その後に先行するすべての回転を行ったかのような結果が得られます。それは明らかに間違った方法です。現在までの他のすべての変更の後に、新しい変更を有効にする必要があります。したがって、事前乗算します。そして、結果を新しい M として保存します。

実際にはそれだけです。次のように、GL マトリックス スタックを明示的に使用して、概念実証をすばやく行うことができます。

// ... I assume the modelview stack is active, M is an array of 16 floats ...

// ensure whatever's on the stack currently is kept safe
glPushMatrix();

    // but we don't actually care what it was, so load the identity
    glLoadIdentity();

    // build our rotation matrix first
    glRotatef(changeAroundX, 1, 0, 0);
    glRotatef(changeAroundY, 0, 1, 0);

    // multiply by M. OpenGL postmultiplies by the newer matrix, so this
    // is premultiplying M by whatever we just loaded
    glMultMatrixf(M);

    // read the new M back
    glGetFloatv(GL_MODELVIEW_MATRIX, M);

// and pretend we never touched the stack
glPopMatrix();

次に、glRotatef の代わりに glMultMatrixf(M) を使用して、現在のオブジェクトの回転を適用します。これは概念の証明にすぎません。これは、M に対して大量の操作を行った結果として、M で厄介な数値エラーがすぐに発生するためです。進行中に M を修正できますが、既にクォータニオン コードがあり、それに満足している場合は、そのルートをたどる方が賢明かもしれません。論理行列演算を同等の四元数に置き換えるだけです。

于 2011-01-27T00:26:34.957 に答える
-1

この本のリンクを読むことをお勧めします

特にあなたの質問:パート3.3.1を参照してください

于 2011-01-26T13:32:53.843 に答える