Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 球形摄像机_Java_Android_Opengl Es_Libgdx - Fatal编程技术网

Java 球形摄像机

Java 球形摄像机,java,android,opengl-es,libgdx,Java,Android,Opengl Es,Libgdx,见下面我的编辑 我在原点画了一个球体。我的相机正以3个单位的半径观察球体。我正在尝试使用2D操纵杆使相机环绕球体。我目前正在使用下面的代码环绕球体,但我不确定如何允许操纵杆控制操纵杆指向的方向的旋转。我的操纵杆提供0度向上的角度,当你逆时针旋转时,角度上升到360度。操纵杆离其中心起点越远,转速将增加。我只是不知道该怎么做 PIOVER180 = Math.PI/180; rho = 3; theta = (theta+1)%360; phi = (theta+1)%360; camera.p

见下面我的编辑

我在原点画了一个球体。我的相机正以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
类,我希望将其扩展为
SphereicalCamera
,并在需要时使用它调用我的旋转

编辑:


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

您正试图以操纵杆控制的方式围绕球体旋转,同时观察中心,对吗

如果操纵杆给你一个角度“ang”,单位为度,0表示向上,那么每个轴的分量是:

double x = Math.sin(ang*Math.PI/180.);
double y = Math.cos(ang*Math.PI/180.);
然后,您可以使用“速度”参数将相机在其自身的上/左平面上平移这些量:

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

希望这有帮助

通常最好在场景中使用
glRotate(灵敏度,joystickMovementY,joystickMovementX,0.0f)
,而不是移动摄像机我正在考虑这样做,但我也将有一组模型用子弹环绕我的球体。我想改变相机的视角会更容易?这样移动相机没有什么错。只是你最终会实现一系列数学方法,这些方法完全可以做
glRotate()
glTranslate()
等已经做过的事情。是的,我想我已经注意到你的意思了哈哈。。。我希望一旦我把它设置好,它会很容易。事实上,我已经决定使用四元数进行旋转,试图在此时将我的头绕在四元数上。查看并查找四元数。第二个链接也有代码示例,我已经从libGDX切换到Unity3D,但理论上是一样的(在查看了我的Unity3D代码后,我有一个非常类似的过程,就像你发布的内容减去一个稍微不同的API)。。。我将此标记为已接受的答案,因为它是正确的,并且将适用于libGDX。如果我评论camera.direction.set(camera.position.scl(-1.nor()),我会非常感激行,此函数允许我移动相机。如何更改与偏移量一起工作的函数?问题是它每次都会重置中心的偏移和球体。有没有一种方法可以将此代码用于在固定位置上绕球体旋转的对象,而不是相机?