gpt4 book ai didi

java - 为什么这个 JOGL 代码不能正确翻译?

转载 作者:行者123 更新时间:2023-11-30 11:44:26 25 4
gpt4 key购买 nike

    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)。有什么想法吗?

最佳答案

我认为您可能正试图将您对数学变换的学习过于直接地转移到 OpenGL。从字面上解释您所写的内容,您正在从原点开始翻译,应用旋转,然后尝试以相反的顺序向底部撤消这两个操作。看起来您正在尝试“撤消”这些转换,以便稍后进行其他转换。

当我们从数学上讨论转换时,这是有道理的,但在代码中,我们在 glPushMatrix()glPopMatrix() 中有一个很好的快捷方式,您可以在其中使用两者来在特定范围内“包装”您的转换。它与函数作用域或循环作用域非常相似——在此 block 内发生的任何转换都不会影响该作用域之外的任何内容。

优点:

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 block 中。这是另一个 question这涵盖了比我在这里更好的插入和弹出。

关于java - 为什么这个 JOGL 代码不能正确翻译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10792374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com