3

Quaternionこれまでのところ、回転用を作成することができました。唯一の問題は、特定のキューブのみに適用するにはどうすればよいですか? 現時点でキーボードの右キーを押すと、すべての立方体が原点を中心に連続的に回転します。

参考までに、ルービック キューブ (2x2x2) と同様のセットアップで配置された 8 つのキューブがあります。右/左矢印を押すと、'Cube' (8 つの小さな立方体で構成される大きな立方体) の右/左面が、時計回り/反時計回りに 90 度回転します。

Cubes の 1 つの例 (合計 8​​ つのキューブのうち) の宣言:

GameObject subCube3 = new GameObject();  
Vector3 subCube3Pos = new Vector3(-0.55f, -0.55f, 0.55f); 

私の更新方法では:

// declare rotation floats     
float updownRotation = 0.0f;     
float leftrightRot = 0.0f;     

// get state of keyboard     
KeyboardState keys = Keyboard.GetState();     

// if key is pressed, change value of rotation     
if (keys.IsKeyDown(Keys.Right))     
{     
    leftrightRot = -0.10f;     
}

// if key is pressed, change value of rotation     
if (keys.IsKeyDown(Keys.Left))     
{     
    leftrightRot = 0.1f;     
}     

// if key is pressed, change value of rotation     
if (keys.IsKeyDown(Keys.Up))     
{
    updownRotation = 0.1f;     
}

// rotation around axis     
Quaternion addRot = Quaternion.CreateFromAxisAngle(new Vector3(1.0f, 0.0f, 0.0f), leftrightRot);

//rotation of cubes     
cubeRotation = cubeRotation * addRot; 

私の描画機能:

void DrawGameObject(GameObject gameobject)
{     
    //graphics.GraphicsDevice.RenderState.CullMode = CullMode.None;     
    foreach (ModelMesh mesh in gameobject.model.Meshes)     
    {     
        foreach (BasicEffect effect in mesh.Effects)     
        {     
            effect.EnableDefaultLighting();     
            effect.PreferPerPixelLighting = true;     
            effect.World =     
                Matrix.CreateScale(gameobject.scale) *     
                Matrix.CreateFromQuaternion(cubeRotation) *     
                Matrix.CreateTranslation(gameobject.position);     

            effect.Projection = cameraProjectionMatrix;     
            effect.View = cameraViewMatrix;     
        }
        mesh.Draw();     
    }
}

私が問題だと思うのは、Matrix.CreateTranslation(gameobject.position)明らかにすべてのキューブに影響を与えていることです。Vector3新しいie:を作成しようとしましc_component1 = Vector3.Transform(cube1pos, cubeRotation);たが、それでも、それをどこに置いて実際に使用するのかわかりません。

アイデアはありますか?どんな助けでも大歓迎です。

4

2 に答える 2

1

ルービックキューブのシナリオでは、すでに持っているクアットに加えて、小さなキューブごとにクアタニオンが必要になります。これらの小さいクアットは、それらとバッチ全体(現在持っているもの)のクアットとの間の配向の違いを表します。ここでは、ボーンシステムと同じように階層構造を考えてください。少数の立方体(たとえば、すべて左側)だけを回転させたい場合は、回転クワットをそれらの特定の小さい立方体のクアットに乗算するだけで、他の立方体は回転しません。

次に、描画するために、小さな立方体のクワットを大きな立方体のクアットと連結して、最終的な方向クアットを作成します。小さな立方体ごとにそれを行います。

すべての小さな立方体の位置を表すvector3にも同じ構造が必要になります。

したがって、SmallCubeというクラスがあり、それを8回インスタンス化したとします。クアットとVector3(位置用)を保持します。

立方体が世界の原点の周りに配置されており、上部の立方体のみを回転させたいと仮定します。

Foreach(smallCube sc in smallCubes)
{
   if(sc.Position.Y > 0.1f)
   {
     Quaternion addRot = Quaternion.CreateFromAxisAngle(Vector3.Up, MathHelper.ToRadians(90));
     sc.quat *= addRot
     sc.Position = Vector3.Transform(sc.Position, addRot);
   }
}

マトリックスとは対照的に、これにクォータニオンを使用すると、追加の利点があります。組み込みのQuaternion.Dot()メソッドを使用して、解決をテストできます。すべての小さな立方体の向きが同じである場合は、すべての色を並べる必要があります。これが発生すると、すべての内積は1.0fになります。マトリックスには同等の機能はありません。

于 2010-08-21T21:23:56.220 に答える
0

回転させたい特定のキューブを選択するには、それをクリックする (初心者にとっては XNA ではかなり難しい) か、キーパッドで数字を押すなどのテクニックが必要です。次に、各ゲームオブジェクトで、それが選択されているかどうかを確認し、ある場合にのみ回転を適用します。

これが理にかなっていることを願っています...

于 2010-08-13T14:25:53.053 に答える