我在 JOGL 中构建了一些东西,并且我希望通过使用键盘或鼠标使相机移动,这并不重要,只要相机可以围绕对象平移并可能放大和缩小。如果使用键盘/鼠标很困难,那么我也不介意在应用程序中使用一些按钮,例如向上、向下、向左和向右箭头以及用于缩放的加号和减号按钮,但基本上是最简单的。我正在建造类似乐高的东西,但事实证明,如果不能移动相机,这非常困难。
2 回答
要移动“相机”,您需要在渲染函数的开头应用 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 ){}
确保将此实现类注册为您的 GLJPanel(或您正在使用的任何东西)的 KeyListener。然后,在 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/
(该主题的众多资源之一)
您使用了一个名为“gluLookAt(x 的位置, y 的位置, z 的位置, 相机所见位置的 x, 相机所见位置的 y, 相机所见位置的 z, 0, 1, 0) ;"
至于“0,1,0”部分,保持原样,就像您只是平移和放大一样。这只会影响相机的倾斜度。