2012-05-29 80 views
2
public Cube(int x, int y, int z, int x2, int y2, int z2){ 
    int tmpX = x; 
    int tmpY = y; 
    int tmpZ = z; 

    if(x > x2){x = x2; x2 = tmpX;} 
    if(y > y2){y = y2; y2 = tmpY;} 
    if(z > z2){z = z2; z2 = tmpZ;} 

    int centerX = x2 - x; 
    int centerY = y2 - y; 
    int centerZ = z2 - z; 

    GL11.glTranslatef(centerX, centerY, centerZ); 
    GL11.glRotatef(rot, 0f, 0f, 1f); 
    GL11.glBegin(GL11.GL_QUADS); 

     //front 
     color(255, 0, 0); 
     v3d(x, y, z); 
     v3d(x, y2, z); 
     v3d(x2, y2, z); 
     v3d(x2, y, z); 

     //top 
     color(0, 255, 0); 
     v3d(x, y, z); 
     v3d(x2, y, z); 
     v3d(x2, y, z2); 
     v3d(x, y, z2); 

     //back 
     color(0, 0, 255); 
     v3d(x2, y2, z2); 
     v3d(x, y2, z2); 
     v3d(x, y, z2); 
     v3d(x2, y, z2); 

     //bottom 
     color(255, 255, 0); 
     v3d(x, y2, z); 
     v3d(x2, y2, z); 
     v3d(x2, y2, z2); 
     v3d(x, y2, z2); 

     //left 
     color(255, 0, 255); 
     v3d(x, y, z); 
     v3d(x, y2, z); 
     v3d(x, y2, z2); 
     v3d(x, y, z2); 

     //right 
     color(0, 255, 255); 
     v3d(x2, y, z); 
     v3d(x2, y2, z); 
     v3d(x2, y2, z2); 
     v3d(x2, y, z2); 

    GL11.glEnd(); 
    GL11.glRotatef(-rot, 0f, 0f, 1f); 
    GL11.glTranslatef(-centerX, -centerY, -centerZ); 

    rot += 0.75f; 
    if(rot > 360){ 
     rot -= 360; 
    } 
} 

我不明白爲什麼它不圍繞立方體對象本身圍繞Z軸旋轉,而是它看起來只是在矩陣中圍繞0,0,0旋轉。JOGL代碼爲什麼不能正確翻譯?

我也嘗試這對於定心代碼:

 int xWidth = x2 - x; 
    int yWidth = y2 - y; 
    int zWidth = z2 - z; 

    int centerX = x + (xWidth/2); 
    int centerY = y + (yWidth/2); 
    int centerZ = z + (zWidth/2); 

但是測試一些數學(15 - 5 = 10,15 + 7.5 = 12.5)之後的第一個更有意義。 任何想法?

+0

我不知道我的解決方案,你得到期望的結果(我不能很好地理解你的要求),但你應該嘗試,在第一源沒有後來的修改,將呼叫交換到glTranslate和調用glRotate。因爲在OpenGL中,轉換順序確實很重要。希望這會幫助你。而且)(一般情況下,你必須在期望tranformations相反的順序代碼glRotate,glTranslate,glScale的轉換。),以保存/恢復轉換,看看glPushMatrix()和glPopMatrix(。 – loloof64

回答

1

我認爲你可能會想你的數學變換學習太直接傳輸到OpenGL的。解讀你從字面上寫的是什麼,你是從原點翻譯而去,應用旋轉,然後試圖撤消這兩個向底部的,按相反的順序。看起來你正在試圖「撤銷」其他轉換的轉換,以便稍後發生。

當我們談論變革數學這是有道理的,但在代碼中,我們在glPushMatrix()glPopMatrix(),在那裏你可以同時使用在特定的範圍內「包裝」您轉換了一個快捷方式。它與函數範圍或循環範圍非常相似 - 無論在該塊內發生的變換都不會影響該範圍之外的任何內容。

好:

GL11.glTranslatef(centerX, centerY, centerZ); 
GL11.glRotatef(rot, 0f, 0f, 1f); 

這適用於您的轉換來的centerX,centerY和centerZ,然後應用你的繞Z軸旋轉。

壞:

GL11.glRotatef(-rot, 0f, 0f, 1f); 
GL11.glTranslatef(-centerX, -centerY, -centerZ); 

glRotatefglTranslatef這裏是不必要的,可以被註釋掉或刪除。

這是使用你的代碼,你將如何定義一個「對象」的範圍:

GL11.glPushMatrix(); 
// Apply transformations here 
GL11.glBegin(GL11.GL_QUADS); 

    // Draw object here 

GL11.glEnd(); 
GL11.glPopMatrix(); 

因此,如果你希望包括不會被改造和旋轉影響的其他對象的立方體,你會將這些轉換包裝在Push/Pop塊中。這裏的另一個question覆蓋壓入和彈出一個好一點比我這裏有。