相机旋转对准任意平面

本文关键字:任意 平面 旋转 相机 | 更新日期: 2023-09-27 18:04:53

我有一个我认为对相机来说相当简单的场景,但是我的穴居人的大脑拒绝在二维空间之外的任何东西上思考。

我的3D相机需要在一个对象后面对齐。这个物体可以粘在任何表面上,因此相机的"向上"概念可以是任意向量。这是非常类似于这个问题,但因为我不直接控制"玩家"对象,而是试图使用CreateLookAt,我有麻烦的解决方案的意义:我怎么能计算旋转时使用四元数相机?

为了简化测试,让我们假设物体在一个球体上。

我现在有:

  • 目标物体在三维空间中的绝对位置。
  • 表示物体当前所在表面法线的单位向量。在这种情况下,三角形在球体上的法线。
  • X和Y角度描述相机应该如何围绕物体运行。

我相信这是所有需要的,但我不确定如何把它们放在一起,以一种有效的方式。我知道我需要通过对象的normal来变换角度相机,我最好的尝试如下:

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