我有一个我认为对于相机来说相当简单的场景,但我的穴居人大脑拒绝思考超过二维的任何东西。
我的 3D 相机需要在物体后面对齐。这个物体可以粘在任何表面上,因此相机对“向上”的概念可以是任意向量。它与这个问题非常相似,但由于我没有直接控制“玩家”对象而是尝试使用 CreateLookAt,所以我无法理解解决方案:How can I calculate the rotation when using a quaternion camera ?
为了简化测试,我们假设对象在一个球体上。
我目前有:
- 目标对象在 3D 空间中的绝对位置。
- 表示对象当前所在表面的法线的单位向量。在这种情况下,球体上三角形的法线。
- X 和 Y 角度描述了相机应该如何围绕物体运行。
我相信这就是所需要的,但我不确定如何以一种可行的方式将它们组合在一起。我知道我需要通过对象的nor来转换角度相机我的最佳尝试如下:
Matrix orientation = Matrix.CreateRotationY(OrbitYaw) * Matrix.CreateRotationX(OrbitPitch);
orientation.Up = CurrentNormal;
orientation.Right = Vector3.Cross(orientation.Forward, orientation.Up);
orientation.Right = Vector3.Normalize(orientation.Right);
orientation.Forward = Vector3.Cross(orientation.Up, orientation.Right);
orientation.Forward = Vector3.Normalize(orientation.Forward);
Vector3 Target = ObjectPosition;
Vector3 Position = Vector3.Transform(new Vector3(0,50,0), orientation);
Matrix View = Matrix.CreateLookAt(Position, Target, CurrentNormal);
定位代码似乎是正确的,但由于第二个问题很难判断:随着位置的变化,相机似乎“滚动”。这是有道理的——相机所知道的只是它的位置和看哪里,我没有明确告诉它它本身应该如何旋转。这是我需要做的,以便相机在跟随对象时保持恒定的对齐(除了将其保持在相同的相对位置所必需的之外)。