3D相机看着任意点,但从不滚动这样做

时间:2010-12-29 07:11:03

标签: 3d xna

(在C#/ XNA 4.0中)

我有Vector3 cameraPosition,Vector3 targetPosition

我希望我的相机能够看到目标,始终“面对”它,但永不滚动

因此,滚动始终是中性的,要查看目标,相机始终要么调整俯仰或偏航

我尝试了无数的方法和信息组合,我在这里和网上找到但我没有找到任何正常工作的方法。我认为我的问题可能是我的'向上'载体(我试过了.Up,1,0,0,0,1,0,0,0,1)

当我移动相机时,我会这样做:

  CameraPosition += moveSpeed * vectorToAdd;
  UpdateViewMatrix();

UpdateViewMatrix()是..好吧,我已经尝试过我所看到的一切。最简单的......

   View = Matrix.CreateLookAt(CameraPosition, targetPosition, upVector);

其中upVector是Vector3.Up,1,0,0; 0,1,0; 0,0,1或其他更“正确”的尝试来获取我的实际向上矢量。听起来这可能是我的问题..

这应该是简单的,帮助!

2 个答案:

答案 0 :(得分:1)

结束我在某个地方让我感到困惑的是,在我的世界空间中,事情应该是什么样子以及我实际上在考虑什么。我不得不用掉(0,0,1)的向量,事情很有效。

答案 1 :(得分:0)

假设Y-up世界空间,没有滚动意味着相机侧向量具有Y = 0.您必须获得视图方向向量(normalize(targetPos - cameraPos)),并获得与视图正交的侧向量并且Y = 0,换句话说view.x * side.x + view.z * side.z = 0view.y = 0。这是一个简单的2d垂直side = normalize(vector3(-view.z, 0, view.x))

获得侧向量后,您可以获得up = cross(view, side)并构建视图矩阵。

根据坐标系的灵活性,您可能需要否定侧向量。

注意view.y = +-1处有一个奇点(边是零长度矢量);这是因为没有为此俯仰角定义滚动 - 任何滚动值都会给出相同的变换。