我认为对于相机我认为是一个相当简单的场景,但是我的穴居人大脑拒绝在两个维度以外思考。
我的3D相机需要在物体后面对齐。这个物体可以粘在任何表面上,因此相机对“向上”的概念可以是任意向量。它与这个问题非常相似,但由于我不直接控制'播放器'对象,而是尝试使用CreateLookAt,我无法理解解决方案:How can I calculate the rotation when using a quaternion camera?
为简化测试,我们假设对象在球体上。
我目前有:
我相信这就是所需要的,但我不确定如何以一种有效的方式将它们组合在一起。我知道我需要通过对象来转换角度相机,我的最佳尝试如下:
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 :(得分: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
插入到最后一行(在您的情况下应该这样做),但视图矩阵的向上矢量将与对象的向上矢量对齐。