2010-08-11 78 views
3

到目前为止,我设法创建了一个轮换的Quaternion。现在唯一的问题是,我如何将它应用于某些立方体?正如当我按下键盘上的右键时,每个立方体都连续围绕原点旋转。XNA中的旋转立方体

作为参考,我有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);,但即使如此,我仍然不确定将其放在哪里并实际使用它。

任何想法的人?任何帮助都感激不尽。

+0

我希望我有足够的代表编辑您的帖子并修复您的代码格式... – 2010-08-12 00:21:49

+1

哇,谢谢你这样一个完全没有意义的帖子。如果您对我的实际问题和查询没有什么值得说的话,为什么还要在帖子中发帖? 如果除了对代码格式进行评论之外,您无法提供帮助 - 这很明显是这种方式,因为我从文件中复制了它 - 请打扰其他某个线程。 谢谢。 DaveT – DAVETELFA 2010-08-12 01:36:45

+0

我对您的格式设置的评论并不打算亲自进行。但是,如果这就是你想要玩的方式:如果你太懒惰或无能为力让你的文章变得可读,甚至在向你指出之后(格式化帮助不难找到!),并且你对于有人(*两次*现在)花时间访问您的问题以回答它的目的而滥用,并且事实证明您的问题只是从您制作的主题的* middle *中的某处复制粘贴的在XNA论坛上,我没有看到任何人应该付出任何努力来帮助你的原因。 – 2010-08-12 11:08:19

回答

0

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

希望这是有道理...

1

对于魔方的Rubix情况下,除了你已经有四元,你将需要为每个小立方体四元。这些较小的quats表示它们之间的方向差异,以及整个批次(目前您拥有的那个)的quat。这里认为层次结构与骨骼系统不同。当你只想旋转几个立方体时(比如左侧),你只能将一个旋转四舍五入乘以那些特定的小立方体的quats,其他的不旋转。

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

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

因此,假设您有一个名为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); 
    } 
} 

使用Quaternions为此而不是矩阵有额外的好处。您可以使用内置的Quaternion.Dot()方法来测试求解。如果所有小立方体方向都相同,则必须排列所有颜色。发生这种情况时,所有点积将为1.0f。矩阵中没有相等的能力。