2

请参阅下面的我的编辑。

我在原点绘制了一个球体。我的相机正在观察半径为 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类,我希望将其扩展为 aSphericalCamera并在需要时使用它来调用我的轮换。

编辑:

我想如果我能弄清楚如何让 2D 操纵杆正确操纵thetaphi变量,那么它应该可以正常工作。theta是正 x 轴与球体上的点之间的角度,该点在phiz 轴上的位置(正或负),并且rho是从中心点 (0, 0, 0) 到球面上的点的距离球体(基本上是半径)

4

1 回答 1

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

希望这可以帮助!

于 2013-12-16T17:44:20.383 回答