2013-01-21 132 views
3

我正在爲對象旋轉而掙扎。我想用這個小程序來說明我的AR Drone 2.0陀螺儀的讀數。 也許你想先觀看這部短片:http://youtu.be/HvrLS8Olr2cOpenGL相對於對象軸的旋轉

滑塊是X,Y,是與

glRotatef(rotationX, x_vect.x, x_vect.y, x_vect.z); 
glRotatef(rotationY, y_vect.x, y_vect.y, y_vect.z); 
glRotatef(rotationZ, z_vect.x, z_vect.y, z_vect.z); 

做Z軸旋轉其中的值:

Vector x_vect = {1.0f, 0.0f, 0.0f}; 
Vector y_vect = {0.0f, 1.0f, 0.0f}; 
Vector z_vect = {0.0f, 0.0f, 1.0f}; 

你可以從這裏下載這個小應用程序的完整源代碼:http://ablage.stabentheiner.de/2013-01-21_openglimportmodel.zip

問題是,如果你旋轉讓我們說Y軸先然後嘗試使用X滑塊進行遊戲,它不會旋轉它應該執行的軸(請參閱C4D動畫進行比較)。我認爲這是因爲我先進行X旋轉,然後是Y旋轉。交換的代碼行,不解決問題,但它推到另一個軸..

回答

1

http://doc-snapshot.qt-project.org/4.8/opengl-grabber.html

http://doc-snapshot.qt-project.org/4.8/opengl-grabber-glwidget-cpp.html

我在做在Qt的OpenGL的旋轉,抓取例如是非常有益的。這裏有一點來自glwidget.cpp。

void GLWidget::paintGL() 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glPushMatrix(); 
// Here is the rotation code: 
glRotated(xRot/16.0, 1.0, 0.0, 0.0); 
glRotated(yRot/16.0, 0.0, 1.0, 0.0); 
glRotated(zRot/16.0, 0.0, 0.0, 1.0); 

drawGear(gear1, -3.0, -2.0, 0.0, gear1Rot/16.0); 
drawGear(gear2, +3.1, -2.0, 0.0, -2.0 * (gear1Rot/16.0) - 9.0); 

glRotated(+90.0, 1.0, 0.0, 0.0); 
drawGear(gear3, -3.1, -1.8, -2.2, +2.0 * (gear1Rot/16.0) - 2.0); 

glPopMatrix(); 
} 
2

發生這種情況的原因是,當您撥打glRotatef()時,對象的透視將旋轉。看一看這個美麗模具:
awesome d6

想象x軸通過4和3運行(相對側上的D6總是加起來7)至6和1運行z軸,並且y軸通過2和5
運行,如果您編寫此代碼:

glRotatef(90,1,0,0); 
glRotatef(90,0,1,0); 

模具將第一繞90度的x軸,使得6側在頂部。但是,軸相對於模具保持不變,所以下一次調用將保持旋轉模具圍繞穿過2和5的軸線,從而有效地將邊6以右旋轉。當你打開這些電話,並且首先圍繞它的y軸旋轉模具時,帶有6的那一邊將首先在右邊,然後在頂部。

現在,與此同時。你可以做的是圍繞物體旋轉相機,而不是旋轉物體本身。我建議閱讀關於實施一個弧球相機。 This seems like a good start.