【问题标题】:OpenGL -- how to move the scene in response to mouse input using gluLookAtOpenGL——如何使用 gluLookAt 移动场景以响应鼠标输入
【发布时间】:2012-06-12 21:20:43
【问题描述】:

我正在通过QGLWidget 在Qt 中使用OpenGL,我正在尝试实现一些基本的鼠标和键盘驱动的交互。

例如,键盘方向键用于“平移”场景,鼠标滚轮用于放大场景,鼠标用于旋转模型。

我已经弄清楚如何实现平移和缩放,但是我在实现旋转时遇到了麻烦。

这是我目前所拥有的:

void MyGLWidget::paintGL() {
    glLoadIdentity();
    gluLookAt(0+camDelta[0],0+camDelta[1],-100+camDelta[2],centerCoords[0]+lookAtDelta[0],centerCoords[1]+lookAtDelta[1],centerCoords[2]+lookAtDelta[2],0,1,0);
    // draw stuff here
}

所以基本上我设置了初始 gluLookAt 参数,然后我添加了两个数组,float camDelta[3]float lookAtDelta[3],以跟踪相机位置的变化以及它正在寻找的位置以响应用户与场景的交互.

对于鼠标滚轮,我这样做:

void MyGLWidget::wheelEvent(QWheelEvent *event) {
    camDelta[2] += (event->delta() / 8.0 / 15.0) * WHEEL_DELTA;
    lookAtDelta[2] += (event->delta() / 8.0 / 15.0) * WHEEL_DELTA;
    updateGL();
}

MyGLWidget::keyPressEvent 类似,我修改了增量的[0] 字段以进行左右平移,修改增量的[1] 以进行上下平移。

所以我的问题是,我如何实现类似的东西来支持鼠标旋转?我有点困惑,因为我猜我不仅要改变相机的视线方向,还要改变向上的矢量,但我真的不知道如何做到这一点。

【问题讨论】:

  • 嗨 Houbysoft,我也在寻找 android 中的平移功能。[我需要使用触摸事件移动 GLSurfaceview]。如果您现在有任何想法,请提供任何示例代码。这对我完成我的工作会有帮助。我的示例代码在这里。mediafire.com/?09f9q51xnqhq2l7.which

标签: qt opengl glulookat


【解决方案1】:

我为这样的事情所做的就是所谓的轨道相机模型。

您可以跟踪相机目标位置(或注视)以及其他 3 个参数:方位角、偏角(或倾角)和距离(或半径)。方位角是相机围绕目标水平旋转的角度(就好像目标在地面上,而您一边看它一边绕着它走一圈)。偏角是垂直旋转。距离就是目标和相机之间的距离。

这些也称为球坐标:

http://mathworld.wolfram.com/SphericalCoordinates.html

你想要这样的方程式:

x = r * sin(phi) * cos(theta)
y = r * sin(phi) * sin(theta)
z = r * cos(phi)

其中 r 是距离,theta 是方位角,phi 是偏角。 这为您提供了从相机观察位置到相机位置的偏移量。

所以这就是你要做的。保留相机目标位置,但不保留相机位置。平移相机时,移动目标位置。旋转相机时,调整方位角和偏角。变焦相机时,调整距离。然后,在调用 gluLookAt 之前的每一帧,使用上述公式计算相机位置。您只需将 x、y 和 z 添加到目标位置即可。

【讨论】:

  • 嗨,ALan,我也在寻找 android 中的平移功能。[我需要使用触摸事件移动 GLSurfaceview]。如果您现在有任何想法,请提供任何示例代码。这对我完成任务很有帮助。我在这里挣扎。我的示例代码在这里。mediafire.com/?09f9q51xnqhq2l7.which
【解决方案2】:

最好的方法是使用四元数。就像复数在 2D 中旋转非常有用一样,四元数非常适合 3D 旋转。

标准的“绕 x、y、z 轴旋转”可以工作,它的行为会很奇怪,并且不像预期的那样。

你可以在http://content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation得到一个很好的教程:http://content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation

【讨论】:

  • 嗨 lvan,我也在寻找 android 中的平移功能。[我需要使用触摸事件移动 GLSurfaceview]。如果您现在有任何想法,请提供任何示例代码。这对我完成任务很有帮助。我在这里挣扎。我的示例代码在这里。mediafire.com/?09f9q51xnqhq2l7.which
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多