首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XNA中的旋转多维数据集

XNA中的旋转多维数据集
EN

Stack Overflow用户
提问于 2010-08-11 19:57:26
回答 2查看 2.4K关注 0票数 3

到目前为止,我已经成功地创建了一个用于旋转的Quaternion。现在唯一的问题是,我如何将其仅应用于特定的立方体?就像当我按下键盘上的右键时,每个立方体都在围绕原点连续旋转。

作为参考,我有8个魔方,其位置与魔方相似(2x2x2)。因此,当我按下右/左箭头时,“立方体”(由8个较小的立方体组成的大立方体)的右/左面将顺时针/逆时针旋转90度。

一个立方体(总共八个立方体)声明的示例:

代码语言:javascript
复制
GameObject subCube3 = new GameObject();  
Vector3 subCube3Pos = new Vector3(-0.55f, -0.55f, 0.55f); 

在我的update方法中:

代码语言:javascript
复制
// 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; 

我的绘图函数:

代码语言:javascript
复制
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);,但即使这样,我也不确定将其放在哪里并实际使用它。

有没有人有主意?任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2010-08-22 05:23:56

对于rubix立方体场景,除了您已经拥有的四元数之外,每个较小的立方体还需要一个四元数。这些较小的四元组代表它们与整个批次的四元组之间的方向差异(您当前拥有的一个)。想想这里的层次结构和骨骼系统没什么不同。当你只想旋转几个立方体(比如说,都在左边)时,你只需要将一个旋转四边形乘以那些特定的较小立方体的四边形,其他的不旋转。

然后,为了绘制,你可以通过连接小立方体的四元组和大立方体的四元组来创建最终的方向四元组。对每个小立方体都这样做。

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

因此,假设您有一个名为SmallCube的类,并且已经将其实例化了8次。它包含一个quat和一个Vector3 (用于位置)。

假设立方体分布在世界原点周围&您只想旋转上面的立方体。

代码语言:javascript
复制
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。在矩阵中没有等价的能力。

票数 1
EN

Stack Overflow用户

发布于 2010-08-13 22:25:53

你需要一些技巧来选择你想要旋转的特定立方体,比如通过点击它(对于初学者来说在XNA中很难)或者通过按下键盘上的某个数字,然后在每个GameObject中,你可以检查它是否被选中,并且只有在它被选中时才应用旋转。

希望这是有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3457954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档