将子对象作为父对象移动

时间:2013-08-21 07:39:15

标签: c# xna

我在尝试串联移动简单模型时遇到问题。我有20个较小的模型附加到一个更大的模型。它本质上是一个带有多个外部大炮的飞碟。我已经看到了其他问题,比如this one,看起来几乎就像我想要的那样。但是,这只会创建绘图翻译。我实际上需要在3d空间中移动子模型,因为它们可以被独立地销毁,因此需要碰撞检测。以下是我如何旋转父级(在Update()函数中):

angle += 0.15f;

RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * Matrix.CreateRotationZ(MathHelper.ToRadians(angle) * MathHelper.PiOver2);

我已经尝试了很多解决方案,但定位总是关闭,所以他们并不真正看起来很依旧。这是我最接近的:

cannons[x].RotationMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) * 
Matrix.CreateRotationZ(MathHelper.ToRadians(angle + cannons[x].angle) * 
MathHelper.PiOver2);

cannons[x].position.X = (float)(Math.Cos(MathHelper.ToRadians(angle + cannons[x].originAngle) *
 MathHelper.PiOver2) * 475) + position.X;

cannons[x].position.Y = (float)(Math.Sin(MathHelper.ToRadians(angle + cannons[x].originAngle) *
 MathHelper.PiOver2) * 475) + position.Y;

我在那段代码中做错了什么?或者,如果我的方法完全关闭,那么这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您应该对所有内容使用Matrix转换。

class Physics {

 public Vector3 Traslation;
 public Vector3 Scale;
 public Quaternion Rotation;

 public Physics Parent;
 public List<Physics> Children;
 public Matrix World;


 public Update() {
      World =   Matrix.CreateScale(Scale) 
              * Matrix.CreateFromQuaternion(Rotation) 
              * Matrix.CreateTranslation;
      if (Parent!=null) {
         World *= Parent.World ;
      }    
      foreach (var child in children) child.Update();         
 }
}

意识到此代码未经优化且可以改进。

这样你就可以为你的大型模型提供一个Physics对象,为小模型提供20个Physics对象,通过Parent属性连接到大型模型。

如果你需要在绝对坐标中对象的Traslation,Rotation和Scale,你可以使用Matrix.Decompose方法,尽管它更好地将World矩阵传递给着色器来转换顶点。