在XNA中移动旋转的模型

这似乎是一个简单的问题,同样简单的解决scheme,是我看不见的。

我有一个模型,在原点产生,看着我的球员模型,无论它走到哪里。

我希望它能够继续向前发展。 每当我尝试翻译它,它消失。 我做错了什么,如何解决?

public override void Update() { //Glo is a global class, where I store the player's world. targetShip = Glo.world.Translation; targetShip.Normalize(); //Rotates the model to face the player's position rotation = RotateToFace(targetShip, pos, Vector3.Up); pos += Vector3.Normalize(targetShip - pos) * 20f; } public override Matrix GetWorld() { // return rotation * translation * world ; return Matrix.CreateFromQuaternion(rotation) * Matrix.CreateTranslation(pos); } 

更新:当我replace:

 translation *= Matrix.CreateTranslation(direction); 

 translation *= Matrix.CreateTranslation(Vector3.Forward); 

它现在向前迈进。

但是,这并不正确地面对我。 它仍然认为这是在原点,并相应地旋转


这里是编辑的RotateToFace函数原始只返回一个matrix

 Quaternion RotateToFace(Vector3 O, Vector3 P, Vector3 U) { //The direction we're facing. Vector3 D = (O - P); //Our relative Right. Vector3 Right = Vector3.Cross(U, D); Vector3.Normalize(ref Right, out Right); //Our back Vector3 Backwards = Vector3.Cross(Right, U); Vector3.Normalize(ref Backwards, out Backwards); //Our relative up Vector3 Up = Vector3.Cross(Backwards, Right); //Make a matrix out of all of these. Matrix rot = new Matrix(Right.X, Right.Y, Right.Z, 0, Up.X, Up.Y, Up.Z, 0, Backwards.X, Backwards.Y, Backwards.Z, 0, 0, 0, 0, 1); Quaternion rot2 = Quaternion.CreateFromRotationMatrix(rot); return rot2; } 

绘制代码:

 public void Draw(Camera camera) { Matrix[] transforms = new Matrix[model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo(transforms); foreach (ModelMesh mesh in model.Meshes) { foreach (BasicEffect be in mesh.Effects) { be.EnableDefaultLighting(); be.Projection = camera.projection; be.View = camera.view; be.World = GetWorld() * mesh.ParentBone.Transform; } mesh.Draw(); } } 

我无法弄清楚你的代码,其中的很多部分是没有意义的,比如规范化位置。 但是,如果我明白了这个问题,就想让模型总是朝某个目标方向前进。 而且您已经有一个名为RotateToFace的帮助器方法来处理旋转部分。

然后移动模型应该像在自身和目标之间取向一样简单,并且将该方向添加到模型的位置乘以一定的速度因子。 就像是:

 public class Entity { public Vector3 Position { get; set; } public Quaternion Rotation { get; set; } public Vector3 Target { get; set; } public float Speed { get; set; } public float MinChaseDistance { get; set; } public void Update(float elapsed) { Rotation = RotateToFace(Target, Position, Vector3.Up); if(Vector3.Distance(Target, Position) > MinChaseDistance) Position += Vector3.Normalize(Target - Position) * Speed * elapsed; } public Matrix GetWorldMatrix() { return Matrix.CreateFromQuaternion(Rotation) * Matrix.CreateTranslation(Position); } } 

注意:早一点错过,但距离检查实际上是必不可less的,因为如果你没有那个,而且Target恰好匹配了Position ,你将得到一个在Zero向量上的Normalize的调用,并且Position变成了错误与NaNs)。