2012-06-12 57 views
1

我在Qt中使用OpenGL,通過QGLWidget,我試圖實現一些基本的鼠標和鍵盤驅動的交互。OpenGL - 如何使用gluLookAt移動場景以響應鼠標輸入

因此,例如,鍵盤上的箭頭鍵將用於「平移」場景,鼠標滾輪放大場景,鼠標應該用於旋轉模型。

我已經想出瞭如何實現平移和縮放,但是我在實現旋轉時遇到了問題。

這是我到目前爲止有:

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]

所以我的問題是,我如何實現類似的支持鼠標旋轉的東西?我有點困惑,因爲我猜測我不得不以某種方式改變攝像頭在哪裏看,而且還要改變向上的矢量,但我並不清楚如何做到這一點。

+0

Houbysoft嗨,我也希望在Android的平移功能[我需要使用觸摸事件來移動GLSurfaceview。如果你現在有任何想法,請給出任何示例代碼。這將有助於我完成我的工作..我的示例代碼在這裏.http://www.mediafire.com/?09f9q51xnqhq2l7.which – harikrishnan

回答

3

我爲這樣的事情所做的事情叫做軌道相機模型。您可以跟蹤攝像機目標位置(或查看)以及其他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添加到目標位置即可。

+0

嗨ALan,我也在尋找在android平移功能[我需要移動使用觸摸事件的GLSurfaceview]。如果你現在有任何想法,請給出任何示例代碼。對我來說完成我的任務會有所幫助。我在這裏奮鬥。我的示例代碼在這裏.http://www.mediafire.com/?09f9q51xnqhq2l7.which – harikrishnan

0

最好的方法是使用四元數。像複數對2D旋轉非常有用,四元數對於3D​​旋轉是完美的。

標準的「圍繞x,y,z軸旋轉」可以工作,它會表現得很奇怪,並不像預期的那樣。

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

+0

嗨lvan,我也在尋找在android中的平移功能[我需要移動GLSurfaceview使用觸摸事件]。如果你現在有任何想法,請給出任何示例代碼。對我來說完成我的任務會有所幫助。我在這裏奮鬥。我的示例代碼在這裏.http://www.mediafire.com/?09f9q51xnqhq2l7.which – harikrishnan