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)。 有什么想法吗?
答案 0 :(得分: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);
这里的glRotatef
和glTranslatef
是不必要的,可以注释掉或删除。
这是使用代码定义单个“对象”范围的方法:
GL11.glPushMatrix();
// Apply transformations here
GL11.glBegin(GL11.GL_QUADS);
// Draw object here
GL11.glEnd();
GL11.glPopMatrix();
因此,如果要包含不受多维数据集转换和旋转影响的其他对象,则可以将这些转换包装在Push / Pop块中。这是另一个question,它比我在这里有更好的推动和弹出。