相机旋转与任意平面对齐

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

我的3D相机需要在物体后面对齐。 这个物体可以粘在任何表面上,因此相机对“向上”的概念可以是任意向量。 它与这个问题非常相似,但由于我不直接控制’播放器’对象,而是尝试使用CreateLookAt,我无法理解解决方案: 如何在使用四元数相机时计算旋转?

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

我目前有:

  • 目标对象在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); 

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

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