1

我有一个我认为对于相机来说相当简单的场景,但我的穴居人大脑拒绝思考超过二维的任何东西。

我的 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);

定位代码似乎是正确的,但由于第二个问题很难判断:随着位置的变化,相机似乎“滚动”。这是有道理的——相机所知道的只是它的位置和看哪里,我没有明确告诉它它本身应该如何旋转。这是我需要做的,以便相机在跟随对象时保持恒定的对齐(除了将其保持在相同的相对位置所必需的之外)。

4

1 回答 1

0

稍微扩展一下 Tim S 在他的评论中所说的内容,您可以从相机所跟随的对象中借用方向的某些方面来获取相机的方向。

cameraPosition = objectPosition + (objectOrientation.Backward * 50);
cameraTarget = objectPosition;

Matrix cameraArc = Matrix.CreateFromAxisAngle(objectOrientation.Up, orbitYaw) * Matrix.CreateFromAxisAngle(objectOrientation.Right, orbitPitch);//assumes objectOriention is a ortho-normal matrix

cameraPosition = Vector3.Transform(cameraPosition - cameraTarget, cameraArc) + cameraTarget;

view = Matrix.CreateLookAt(cameraPosition, cameraTarget, Vector3.Up);

尽管插入Vector3.Up了最后一行(在您的情况下应该这样做),但视图矩阵的向上向量将与对象的向上向量对齐。

于 2013-03-19T13:44:34.880 回答