相机旋转对齐到任意飞机

问题描述:

我有我认为是相机一个相当简单的场景,但我的穴居人大脑拒绝在任何超过两个维度思考。相机旋转对齐到任意飞机

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

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

我目前有:

  • 目标对象在三维空间中的绝对位置。
  • 一个单位矢量,表示对象当前所在表面的法线。在这种情况下,球体上的三角形的法线。
  • X和Y角描述摄像机应如何绕轨道运动。

我相信这是所有必需的,但我不知道如何把它放在一起,以一种有效的方式。我知道,我需要通过对象的norMy最好的尝试改造angle'd相机如下:

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

定位代码似乎是正确的,但它是很难说,因为第二个问题组成:当位置改变时,相机看起来会“滚动”。这是有道理的 - 所有相机知道它的位置和在哪里看,我没有明确告诉它它应该如何旋转。这是我需要做的,以便相机在跟踪对象时保持不变的对齐(除了保持相同相对位置所必需的对齐外)。

+0

球体上的物体是否“直立”?也许你可以使用与球体上的物体相同的旋转。 – 2013-03-19 13:04:12

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到最后一行(你应该在你的情况一样),视图矩阵的方向向量将在对准对象的向上向量。

+0

我的问题是没有创建对象方向矩阵 - 它只是一个支点,所以我相信我仍然需要创建它的旋转矩阵,然后才能使用它。 我试过你的解决方案,但它给了我类似的行为,我自己的尝试 - 我猜这意味着我的方向矩阵有问题?它是使用我的第一篇文章中的代码创建的。 – Stardreamer 2013-03-19 15:46:25

+0

看来问题不在于你的代码,而在于我的正常代。我试图在XNA heightmap示例中创建相同类型的相机,并且它完美地工作。在我的测试中,我仍然从相机中获得非常奇怪的行为。但是,当我画出法线时,它们看起来是正确的 - 是否有我缺少的特殊情况? – Stardreamer 2013-03-19 23:03:58

+0

Steve H的解决方案是正确的。我遇到的问题完全是由于我的正常世代。 :) – Stardreamer 2013-03-26 13:42:31