球形相机

时间:2012-12-12 19:30:26

标签: java android opengl-es libgdx

请参阅下面的编辑。

我在原点绘制了一个球体。我的相机正在看半径为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操纵杆正确操作thetaphi变量那么它应该可以正常工作。 theta是正x轴与球体上的点之间的角度,phi z轴上的点所在的位置(正或负),rho是距离中心点(0,0,0)到球体上的点(基本上是半径)

1 个答案:

答案 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);

希望这有帮助!