我在尝试串联移动简单模型时遇到问题。我有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;
我在那段代码中做错了什么?或者,如果我的方法完全关闭,那么这样做的正确方法是什么?
答案 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矩阵传递给着色器来转换顶点。