1

Direct3D 9 で 3 x 3 x 3 のルービック キューブを開発しています。ユーザーはルービック キューブの 1 つのレイヤーをクリックしてレイヤーをドラッグすることで回転できます。回転は次のようになります。 ここに画像の説明を入力

回転の基になる実装は行列乗算によって計算され、ユーザーがマウスを左にドラッグするたびに、回転角度と回転軸を生成し、それらを使用して回転行列を計算し、回転行列にユニット キューブのワールド行列を掛けます。現在のレイヤーでは、次のようにコード化します

world Rotate の前の下の世界「Cube」は、ルービック キューブではなく、ユニット キューブ クラスを表します。ルービック キューブは 27 個のユニット キューブによって構築されました。このレイヤー内のすべてのユニット キューブを回転させることによって、レイヤーを回転させます。

void Cube::Rotate(D3DXVECTOR3& axis, float angle)
{
    // Calculate the rotation matrix
    D3DXMATRIX rotate_matrix;
    D3DXMatrixRotationAxis(&rotate_matrix, &axis, angle);

    // This may cause the matrix multiplication accumulate errors, how to fix it?
    world_matrix_ *= rotate_matrix;
}

しかし、このコードは悪です。レイヤーを回転させると消えてしまうことがあります。下の図を参照してください。再現するのは非常に困難ですが、id は発生します。 ここに画像の説明を入力

これは、行列乗算の累積エラーが原因である可能性があることはわかっています。そのため、レイヤーが消える前にワールド マトリックスをダンプします。以下のように、マトリックス内の一部の数値が NaN (数値ではない) になっていることがわかります。

world matrix
_11:0.999996 _12:0.000000 _13:0.000000 _14:0.000000
_21:0.000000 _22:-0.508825 _23:-0.860867 _24:0.000000
_31:0.000000 _32:0.860867 _33:-0.508825 _34:0.000000
_41:0.000000 _42:0.000000 _43:0.000000 _44:1.000000


world matrix
_11:0.999996 _12:0.000000 _13:-0.000000 _14:0.000000
_21:0.000000 _22:-0.508824 _23:-0.860866 _24:0.000000
_31:-0.000000 _32:0.860868 _33:-0.508825 _34:0.000000
_41:0.000000 _42:0.000000 _43:0.000000 _44:1.000000


world matrix
_11:0.999996 _12:-0.000000 _13:-0.000000 _14:0.000000
_21:0.000000 _22:-0.508824 _23:-0.860866 _24:0.000000
_31:0.000000 _32:0.860867 _33:-0.508825 _34:0.000000
_41:0.000000 _42:0.000000 _43:0.000000 _44:1.000000


world matrix
_11:0.999996 _12:-0.000000 _13:-0.000000 _14:0.000000
_21:0.000000 _22:-0.508824 _23:-0.860866 _24:0.000000
_31:0.000000 _32:0.860867 _33:-0.508825 _34:0.000000
_41:0.000000 _42:0.000000 _43:0.000000 _44:1.000000


world matrix
_11:0.999996 _12:0.000000 _13:-0.000000 _14:0.000000
_21:0.000000 _22:-0.508824 _23:-0.860866 _24:0.000000
_31:-0.000000 _32:0.860868 _33:-0.508825 _34:0.000000
_41:0.000000 _42:0.000000 _43:0.000000 _44:1.000000


world matrix
_11:1.#QNAN0 _12:1.#QNAN0 _13:1.#QNAN0 _14:0.000000
_21:1.#QNAN0 _22:1.#QNAN0 _23:1.#QNAN0 _24:0.000000
_31:1.#QNAN0 _32:1.#QNAN0 _33:1.#QNAN0 _34:0.000000
_41:1.#QNAN0 _42:1.#QNAN0 _43:1.#QNAN0 _44:1.000000


world matrix
_11:1.#QNAN0 _12:1.#QNAN0 _13:1.#QNAN0 _14:0.000000
_21:1.#QNAN0 _22:1.#QNAN0 _23:1.#QNAN0 _24:0.000000
_31:1.#QNAN0 _32:1.#QNAN0 _33:1.#QNAN0 _34:0.000000
_41:1.#QNAN0 _42:1.#QNAN0 _43:1.#QNAN0 _44:1.000000

問題は、エラーの内容はわかっていますが、それを修正する方法がわかりません。

  • 回転方法を変更する必要がありますか?
  • レイヤーが消える前にマトリックスを修正できますか?

バイナリをダウンロードして試してみることができます。必要に応じて、プロジェクト コードを提供できます。コードがたくさんあるので、ここには記載しませんでした。

4

1 に答える 1