如果您正在为 openGL 创建轨道(围绕 LookAt)相机,我建议您使用以下数据来制作:
LookAtPosition- 3D vector
CamUp - 3D unit vector
RelativeCamPosition - 3D unit vector
CamDistance - decimal number
LookAtPosition 是您将要查看的点。 CamUp 是从相机指向上方的矢量,您可以在 image 上看到它。最好在不旋转的情况下初始化相机,这样 CamUp = [0,1,0]。请注意,它是单位向量,因此其大小/大小/长度始终为 1。RelativeCamPosition 又是单位向量。您可以通过将 LookAt 带到相机来获得它
矢量并除以它的大小,您将保存在 CamDistance 中。在初始化状态下,它可能如下所示:
LookAtPosition = [0,0,0]
CamUp = [0,1,0]
RelativeCamPosition = [1,0,0]
CamDistance = 10
您现在可以通过
获取相机位置
CamPosition = LookAtPosition + RelativeCamPosition * CamDistance
但是您需要将相机旋转一圈,对吗?好吧,单位向量是有原因的——它们很容易在计算中使用。我相信您使用角度进行旋转,因此您只需要使用正弦和余弦。旋转函数可能如下所示:
Rotate(angleX, angleY){
RelativeCamPosition.x = sin(angleX)*cos(angleY);
RelativeCamPosition.z = cos(angleX)*cos(angleY);
RelativeCamPosition.y = sin(angleY);
}
其中 angleX 和 angleY 是水平和垂直方向的绝对(非相对)旋转。您应该始终使用绝对旋转,因为添加时可能会出现浮点错误。不管怎样,我只是在一张纸上做了这些计算,所以我希望它们没事。
编辑:我刚刚注意到,只要您的初始状态就像我写的RelativeCamPosition = [1,0,0],这将起作用。但是,编辑它们应该不难,因此它适用于任意初始状态。