请参阅下面的编辑。
我在原点绘制了一个球体。我的相机正在看半径为3个单位的球体。我正在尝试使用2D操纵杆使相机绕球体运行。我目前正在使用下面的代码围绕球体运行,但我不确定如何让操纵杆控制操纵杆指向的方向的旋转。我的操纵杆提供0度的向上角度,当你逆时针方向移动时,度数会上升到360度。操纵杆距离它的中心起点越远,旋转速度就越快。我只是不确定如何去做。
PIOVER180 = Math.PI/180;
rho = 3;
theta = (theta+1)%360;
phi = (theta+1)%360;
camera.position.x = (float) (rho * Math.sin(theta * PIOVER180) * Math.cos(phi * PIOVER180));
camera.position.y = (float) (rho * Math.cos(theta * PIOVER180));
camera.position.z = (float) (rho * Math.sin(theta * PIOVER180) * Math.sin(phi * PIOVER180));
camera.normalizeUp();
libGDX提供了一个很好的PerspectiveCamera
类,我希望将它扩展为SphericalCamera
并在需要时使用它来调用我的旋转。
修改
我想如果我能弄清楚如何使2D操纵杆正确操作theta
和phi
变量那么它应该可以正常工作。 theta
是正x轴与球体上的点之间的角度,phi
z轴上的点所在的位置(正或负),rho
是距离中心点(0,0,0)到球体上的点(基本上是半径)
答案 0 :(得分:2)
你正试图以一种由操纵杆控制的方式围绕球体旋转,同时看着中心,对吗?
如果操纵杆以度为单位给出角度“ang”,0为向上,那么每个轴的组件将是:
double x = Math.sin(ang*Math.PI/180.);
double y = Math.cos(ang*Math.PI/180.);
您可以做的是将相机在自己的UP / LEFT平面上翻译这些数量,可能使用“速度”参数:
Vector3 left = new Vector3(camera.up).crs(camera.direction).scl((float)(speed*x));
Vector3 up = new Vector3(camera.up).scl((float)(speed*y));
camera.position.add(left).add(up);
此时您的相机将离开所需的轨道,因此您需要将其带回:
camera.position.nor().scl(rho);
在您的代码示例中,您不会在更改位置后更新相机的方向,但必须根据您的说明进行更新。看一下原点:
camera.direction.set(camera.position).scl(-1).nor();
最后更新向上矢量和模型矩阵:
camera.normalizeUp();
camera.update(false);
希望这有帮助!