我在JOGL中构建一些东西,我想通过使用键盘或鼠标来移动相机,这并不重要,只要相机可以平移物体并可能放大和缩小。如果使用键盘/鼠标很困难,那么我也不介意在应用程序中使用某些按钮,例如向上,向下,向左和向右的箭头以及用于缩放的加号和减号按钮,但基本上是最简单的。 我正在构建类似Lego的东西,但是如果不能移动相机就证明它非常困难。
答案 0 :(得分:7)
要移动“相机”,您需要在渲染功能的开头应用glTranslate3f()变换。如果你的相机的位置是
cameraPos = <cx, cy, cz>
然后你应该使用
glTranslate3f( -cx, -cy, -cz );
这将抵消该向量绘制的所有内容。
为了使用键盘实现这一点,您需要使用KeyListener实现并定义接口指定的函数。
public void keyPressed( KeyEvent ke ){ // put something intelligent here... }
public void keyReleased( KeyEvent ke ){}
public void keyTyped( KeyEvent ke ){}
确保将此实现类作为KeyListener注册到您的GLJPanel(或您正在使用的任何内容)。然后,在keyPressed(...)函数内部,检查正在按下哪个键并增加相机的相应坐标。
如果你想得到真正的想象并让鼠标让你环顾四周,你可以通过创建一个MouseMotionListener并注册它来做类似的事情。使用它所需的OpenGL转换可能会根据您要查找的鼠标行为类型而有所不同。如果您只是想要一些简单的东西可以让您环顾四周,那么您可以在x和y方向上跟踪鼠标移动并允许它修改一些偏移角度。沿x方向移动鼠标绕y轴旋转。 y方向上的移动绕x轴旋转。作为一个OpenGL调用,与glTranslate3f()一样,您可以使用glRotatef()围绕每个轴旋转。
glRotatef( angleX, 1, 0, 0 ); // to rotate about the x-axis
glRotatef( angleY, 0, 1, 0 ); // to rotate about the y-axis
同样,这只是一个快速简便的解决方案。它不会很漂亮,但它会起作用。如果你想要实现更有趣的东西,你可以考虑计算任意轴旋转矩阵。
http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/
(关于这个主题的许多资源之一)
答案 1 :(得分:1)
你使用一个名为“gluLookAt”的函数(x的位置,y的位置,z的位置,相机所在的x,相机所在的y,相机所在的z,0,1 ,0);“
对于“0,1,0”部分,请保持原样,因为您只是平移和放大。这只会影响相机的倾斜。