相机旋转与任意平面对齐

时间:2013-03-19 12:46:55

标签: c# math xna camera

我认为对于相机我认为是一个相当简单的场景,但是我的穴居人大脑拒绝在两个维度以外思考。

我的3D相机需要在物体后面对齐。这个物体可以粘在任何表面上,因此相机对“向上”的概念可以是任意向量。它与这个问题非常相似,但由于我不直接控制'播放器'对象,而是尝试使用CreateLookAt,我无法理解解决方案:How can I calculate the rotation when using a quaternion camera?

为简化测试,我们假设对象在球体上。

我目前有:

  • 目标对象在3D空间中的绝对位置。
  • 表示对象当前所在表面法线的单位向量。在这种情况下,球体上三角形的法线。
  • 描述相机应如何绕物体运行的X和Y角度。

我相信这就是所需要的,但我不确定如何以一种有效的方式将它们组合在一起。我知道我需要通过对象来转换角度相机,我的最佳尝试如下:

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

定位代码似乎是正确的,但由于第二个问题,很难分辨:相机在位置变化时似乎“滚动”。这是有道理的 - 所有相机都知道它的位置和外观,我并没有明确告诉它应该如何旋转。这就是我需要做的事情,以便相机在跟踪物体时保持恒定的对齐(除了保持它在相同的相对位置所需的对齐)。

1 个答案:

答案 0 :(得分: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插入到最后一行(在您的情况下应该这样做),但视图矩阵的向上矢量将与对象的向上矢量对齐。