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 旋转。

我也试过这个居中代码:

        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)。有任何想法吗?

4

1 回答 1

1

我认为您可能正试图将您对数学变换的学习也直接转移到 OpenGL。从字面上解释您所写的内容,您正在从原点平移,应用旋转,然后尝试以相反的顺序撤消这两者到底部。看起来您正试图“撤消”这些转换,以便稍后发生其他一些转换。

当我们在数学上谈论转换时,这是有道理的,但是在代码中,我们在glPushMatrix()and中有一个很好的快捷方式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);

这里的glRotatefandglTranslatef是不必要的,可以注释掉或删除。

这是您使用代码定义单个“对象”范围的方式:

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

    // Draw object here

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

因此,如果您想包含不受立方体变换和旋转影响的其他对象,您可以将这些变换包装在 Push/Pop 块中。这是另一个比我在这里更好地涵盖推送和弹出的问题。

于 2013-03-12T04:20:47.947 回答