2013-11-05 92 views
1

我想旋轉一個多邊形到位,但它保持旋轉。Opengl glRotatef旋轉一個多邊形,將不會旋轉到位

要旋轉,我通過查找每個頂點的平均位置來計算中心。我稱之爲旋轉函數,然後使用中心調用翻譯將其移動到屏幕中間。它最終會居中,但它仍然會旋轉,就好像它不是。任何想法,我可能做錯了什麼?

這裏是我的代碼:

void Polygon::DrawPolygon() 
{ 
    glPushMatrix(); 
    glLoadMatrixf(matrix); 
    glTranslatef(displace[0], displace[1], displace[2]); 
    glRotatef(rotation[0], 1, 0, 0); 
    glRotatef(rotation[1], 0, 1, 0); 
    glRotatef(rotation[2], 0, 0, 1); 
    glTranslatef(-displace[0], -displace[1], displace[2]); 
    displace[0] = 0; displace[1] = 0; displace[2] = 0; 
    glGetFloatv(GL_MODELVIEW_MATRIX, matrix); 
    DrawMaterial(); 
    DrawFaces(); 
    ConnectFaces(); 
    glPopMatrix(); 
} 

下面是如何計算的中心:因爲我的擠壓作品我並不需要添加x和y爲頂點的方式

void Polygon::FindCenter() 
{ 
    float x = 0; 
    float y = 0; 
    float z = 0; 

    for(int j = 0; j < 2; j++) 
    { 
     for(int i = 0; i < vertexCount; i++) 
     { 
      x += vertices[i][0]; 
      y += vertices[i][1]; 
      z += vertices[i][2] + extrusionDistance * j; 
     } 
    } 
    x = x/(vertexCount * 2); 
    y = y/(vertexCount * 2); 
    z = z/(vertexCount * 2); 

    displace[0] = x; 
    displace[1] = y; 
    displace[2] = z; 
} 

的兩面,但我仍然保持一致。

這是我如何繪製形狀:

void Polygon::DrawFaces() 
{ 
    for(int j = 0; j < 2; j++) 
    { 
     glBegin(GL_POLYGON); 
     for(int i = 0; i < vertexCount; i++) 
     { 
      glVertex3f(vertices[i][0], vertices[i][1], j*extrusionDistance); 
     } 
     glEnd(); 
    } 
} 

void Polygon::ConnectFaces() 
{ 
    for(int i = 0; i < vertexCount; i++) 
    { 
     glBegin(GL_POLYGON); 
     glVertex3f(vertices[i][0], vertices[i][1], 0); 
     glVertex3f(vertices[i][0], vertices[i][1], extrusionDistance); 
     glVertex3f(vertices[(i+1)%vertexCount][0], vertices[(i+1)%vertexCount][1], extrusionDistance); 
     glVertex3f(vertices[(i+1)%vertexCount][0], vertices[(i+1)%vertexCount][1], 0); 
     glEnd(); 
    } 
} 
+0

您是否打算在第二個翻譯中忽略「置換[2]」?你能告訴你如何計算位移值嗎? – user1118321

+0

我認爲這可能已經做到了。我使用for循環遍歷每個頂點並將它們彙總在一起。但我正在做的是繪製一個基於用戶輸入的多邊形,然後擠壓它。我將編輯以顯示我認爲正在工作的內容,幷包括我如何計算替換。 – user2833514

+0

看起來它在工作,但它有相同的問題。我仍然不明白爲什麼。 – user2833514

回答

0

我看到站出來把我當成是奇怪的幾件事情:

1)你的電話之前打電話給glLoadMatrixf(matrix)glTranslate()glRotate()。取決於您正在加載的矩陣中的內容,這會改變事物。

2)你FindCenter()方法計算由包括在z的計算vertex[i][2]中心,但是當你真正在DrawFaces()繪製的面孔,你不包括vertex[i][2]部分,只是extrusion * j部分。所以你並沒有畫出與你計算中心相同的東西。

+0

我加載的矩陣是最後用glGetFloatv(GL_MODELVIEW_MATRIX,matrix);保存的矩陣。我知道那部分不是問題。我正在做的是通過使用鼠標輸入來旋轉多邊形,並且我不希望每次用戶單擊時都會重置旋轉,所以我保存矩陣以記錄旋轉。 編輯:我不應該說我*知道*它的作品。我之前使用它來旋轉幾個堅實的茶壺模型,它的工作完美。如果問題出在哪裏,我會很驚訝。 – user2833514

+0

至於你的第二個評論,這是一個很好的接觸和一個糟糕的方式來編寫我的部分。但繪製面部的方式是用戶單擊以添加頂點,然後右鍵單擊以擠出。所以第一張臉是在z = 0處繪製的。對於這個項目,我總是將0作爲頂點的值[i] [2],而不管我是什麼。 – user2833514