3d - XNA 中的旋转立方体

标签 3d xna rotation rubiks-cube

到目前为止,我已经成功创建了一个 Quaternion为旋转。现在唯一的问题是,我如何将它仅应用于某些立方体?就像我此刻按下键盘上的右键一样,每个立方体都围绕原点不断旋转。

作为引用,我将 8 个立方体放置在与魔方 (2x2x2) 类似的设置中。因此,当我按下右/左箭头时,“立方体”(由 8 个较小立方体组成的大立方体)的右/左面顺时针/逆时针旋转 90 度。

一个多维数据集(总共八个多维数据集)声明的示例:

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即:c_component1 = Vector3.Transform(cube1pos, cubeRotation);但即便如此,我也不确定该放在哪里并实际使用它。

有什么想法吗?任何帮助都感激不尽。

最佳答案

对于 rubix 立方体场景,除了您已经拥有的 quat 之外,您还需要为每个较小的立方体使用一个四元数。这些较小的季铵盐代表它们与整个批处理的季铵盐(您当前拥有的那个)之间的方向差异。在这里考虑层次结构与骨骼系统不同。当您只想旋转几个立方体(例如,全部在左侧)时,您只需将旋转 quat 乘以那些特定的较小立方体的 quat,其他的不会旋转。

然后,对于绘图,您通过连接小立方体的 quat 与大立方体的 quat 来创建最终的方向 quat。对每个小立方体都这样做。

对于表示所有较小立方体位置的vector3,您也需要相同的结构。

因此,假设您有一个名为 SmallCube 的类,并且已经实例化了 8 次。它包含一个 quat 和一个 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。矩阵中没有等效的能力。

关于3d - XNA 中的旋转立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3457954/

相关文章:

python - 使用不同的预先计算的 bin 形状和频率渲染直方图

c# - 如何在 Unity 3d 中跳转?

php - 如果旋转正在移动则停止视频

html - 旋转div时如何显示不同的内容

android - 如何在 Android SDK 示例中的 MapViewCompassDemo 中管理叠加层

c++ - 用于存储 3d 点的高效数据结构

3d - 从消失点计算旋转矩阵

c# - 在c#中,定义纯方法的规则是什么?

c# - 我应该在 XNA 中重用模型实例吗?

c# - WPF 与 XNA 渲染数千个 Sprite