Java 球形摄像机
见下面我的编辑 我在原点画了一个球体。我的相机正以3个单位的半径观察球体。我正在尝试使用2D操纵杆使相机环绕球体。我目前正在使用下面的代码环绕球体,但我不确定如何允许操纵杆控制操纵杆指向的方向的旋转。我的操纵杆提供0度向上的角度,当你逆时针旋转时,角度上升到360度。操纵杆离其中心起点越远,转速将增加。我只是不知道该怎么做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
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()),我会非常感激代码>行,此函数允许我移动相机。如何更改与偏移量一起工作的函数?问题是它每次都会重置中心的偏移和球体。有没有一种方法可以将此代码用于在固定位置上绕球体旋转的对象,而不是相机?