【发布时间】:2014-05-05 18:00:42
【问题描述】:
我可以使用什么旋转矩阵来让我的模型面对某个点?
我的模型是一个角色,我希望它面对摄像机的位置。
我尝试了 Matrix.LookAt,但它不起作用。
【问题讨论】:
-
定义
doesn't work -
我的模型刚刚消失,经过一番研究我发现 Matrix.LookAt 仅用于相机的
view。
我可以使用什么旋转矩阵来让我的模型面对某个点?
我的模型是一个角色,我希望它面对摄像机的位置。
我尝试了 Matrix.LookAt,但它不起作用。
【问题讨论】:
doesn't work
view。
假设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);
【讨论】:
不等! 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#
【讨论】: