【问题标题】:XNA: Rotate a model to face a targetXNA:旋转模型以面对目标
【发布时间】:2014-05-05 18:00:42
【问题描述】:

我可以使用什么旋转矩阵来让我的模型面对某个点?

我的模型是一个角色,我希望它面对摄像机的位置。

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

【问题讨论】:

  • 定义doesn't work
  • 我的模型刚刚消失,经过一番研究我发现 Matrix.LookAt 仅用于相机的view

标签: c# matrix xna


【解决方案1】:

假设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);

【讨论】:

    【解决方案2】:

    不等! Matrix.CreateLookAt 有效!

    认为你只使用过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 basic 代码;认为你可以把它变成 C#

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多