(在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或其他更“正确”的尝试来获取我的实际向上矢量。听起来这可能是我的问题..
这应该是简单的,帮助!
答案 0 :(得分:1)
结束我在某个地方让我感到困惑的是,在我的世界空间中,事情应该是什么样子以及我实际上在考虑什么。我不得不用掉(0,0,1)的向量,事情很有效。
答案 1 :(得分:0)
假设Y-up世界空间,没有滚动意味着相机侧向量具有Y = 0.您必须获得视图方向向量(normalize(targetPos - cameraPos)
),并获得与视图正交的侧向量并且Y = 0,换句话说view.x * side.x + view.z * side.z = 0
,view.y = 0
。这是一个简单的2d垂直side = normalize(vector3(-view.z, 0, view.x))
。
获得侧向量后,您可以获得up = cross(view, side)
并构建视图矩阵。
根据坐标系的灵活性,您可能需要否定侧向量。
注意view.y = +-1
处有一个奇点(边是零长度矢量);这是因为没有为此俯仰角定义滚动 - 任何滚动值都会给出相同的变换。