XNA:旋转模型以面向目标

时间:2014-05-05 18:00:43

标签: c# matrix xna

我可以使用什么样的旋转矩阵让我的模特面对某一点?

我的模特是一个角色,我希望它面对相机位置。

我尝试了Matrix.LookAt,但它不起作用。

2 个答案:

答案 0 :(得分:2)

假设lookVector是模型空间中定义角色视图方向的向量。通常这是主轴之一(例如z轴)。让我们进一步假设角色位于characterPosition,目标点为target

世界空间中朝向目标的视图方向是

var view = target - characterPosition;

现在我们需要做的就是找到一个将lookVector映射到view的旋转矩阵。解决方案并不是唯一的,但我们正在寻找具有最小旋转角度的解决方案。

可以找到旋转轴与十字积,旋转角与点积:

var rotationAxis = Vector3.Cross(lookVector, view);
var rotationAngle = (float)Math.Acos(Vector3.Dot(lookVector, view) / lookVector.Length() / view.Length());

现在我们可以构造旋转矩阵:

var rotationMatrix = Matrix.CreateFromAxisAngle(rotationAxis, rotationAngle);

答案 1 :(得分:0)

没有等待! Matrix.CreateLookAt Works!

认为您只使用了Matrix.CreateLookAt(Ship.Position, Target.Position, Ship.ModelRotation.Up)

之类的内容

但你必须添加一个Matrix.CreateTranslation才能让它发挥作用。或者它会改变它的形状而不是旋转!

这是代码

Ship.ModelRotation = Matrix.CreateTranslation(Ship.Position) * Matrix.CreateLookAt(Ship.Position, Target.Position, Ship.ModelRotation.Up)

两天之内,我遇到了严重的麻烦。但是这个愚蠢的代码解决了这个问题

修改

我不知道为什么,但这是目前为我工作的代码

Ship.ModelRotation = Matrix.invert( Matrix.CreateTranslation(Ship.Position) * Matrix.CreateLookAt(Ship.Position, Target.Position, Ship.ModelRotation.Up))

注意 - 这是一个Visual基本代码;认为你可以把它变成C#