Java LWJGL-旋转和移动=问题

Java LWJGL-旋转和移动=问题,java,rotation,logic,2d,lwjgl,Java,Rotation,Logic,2d,Lwjgl,长话短说,我正在做一个LWJGL引擎,并且正在画一个基本的四元结构。当我画这个四边形并使用键盘监听器时,它可以完美地上/下/左/右移动 但是,当我平移和旋转时,它也会围绕其中心点旋转,很好地将两者结合使用,然后就会出现问题。旋转开始偏离轴,每次你们移动时,你们都会绕着另一个奇怪的点旋转 如何使其能够移动四边形(不相对于旋转),以及旋转四边形 编辑1 我发现这个四边形的一个主要问题是,当我旋转它时,我的整个屏幕(包括文本)都会旋转 我当前的结果: 运动前 移动后(希望您注意到它在一个圆圈中移动,

长话短说,我正在做一个LWJGL引擎,并且正在画一个基本的四元结构。当我画这个四边形并使用键盘监听器时,它可以完美地上/下/左/右移动

但是,当我平移和旋转时,它也会围绕其中心点旋转,很好地将两者结合使用,然后就会出现问题。旋转开始偏离轴,每次你们移动时,你们都会绕着另一个奇怪的点旋转

如何使其能够移动四边形(不相对于旋转),以及旋转四边形

编辑1

我发现这个四边形的一个主要问题是,当我旋转它时,我的整个屏幕(包括文本)都会旋转

我当前的结果:

运动前

移动后(希望您注意到它在一个圆圈中移动,而不是我向左移动时仅向左移动。)

代码:

(显示设置)

(键盘侦听器)

(移动/旋转逻辑)

(绘制四边形(与渲染过程的其余部分分离))


任何帮助都将不胜感激,如果您打算否决投票,请给出一个原因,以便我可以改进此问题,或者更好的是,发表评论。

这里的问题是您在
setRotation
函数中调用OpenGL的translate和rotate函数的顺序。调用的顺序必须是平移(如果有)->旋转(如果有)->缩放。您不能更改此呼叫顺序,也不能将它们混在一起。否则你就得不到想要的结果。这是因为OpenGL内部处理这些命令的方式不同

设置旋转
功能更改为

public void setRotation(float degrees) {
    // TODO: Fix whatever the hell the problem is here.
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glLoadIdentity();
    GL11.glTranslatef(x , y , 0);       
    GL11.glRotatef(degrees, 0f, 0f, 1f);

}
您会注意到,如果添加这些行

GL11.glTranslatef(x , y, 0);
下面

GL11.glRotatef(degrees, 0f, 0f, 1f);
,结果将完全不同。意思是顺序很重要

userLogic()
函数中也存在一些问题。在这种情况下,您需要创建一个全局变量来存储旋转,然后将其传递给
setRotation()

这是我制作的一个简单的lwjgl项目,展示了四边形和三角形的平移和旋转

这不起作用。所有这些只是从我整个屏幕的左上角旋转它。我也有一个问题,它不仅旋转正方形,它还旋转我屏幕上的所有东西!这是因为您在执行任何操作之前重置了翻译。因此,如果我这样做的话,添加任何代码都没有意义。我已经编辑了答案。现在应该可以了。您需要将活动矩阵更改为MODEL_视图,并将其初始化为标识矩阵。因为这些平移相互抵消,所以应该得到一个旋转正方形。嗯。。。什么都没有改变。。。。我创建了一个名为旋转的
int
,并使它也等于我想要改变的度数。所以它仍然旋转,但仍然从原点开始…我添加了一些最终修复。这段代码在我制作的测试lwjgl项目上运行良好。抱歉,我应该测试我之前发布的代码。
public void render() {
    switch(type) {
    case IMAGE:
        // Not ready yet.
        break;
    case TRIANGLE:
        // Not ready yet.
        break;
    case RECTANGLE:
        GL11.glColor3f(colour.red, colour.green, colour.blue);

        // X, Y, WIDTH, HEIGHT are the QUADS coords, not the displays or anything else's.

        GL11.glBegin(GL11.GL_QUADS);
            GL11.glVertex2f(x, y);
            GL11.glVertex2f(x + width, y);
            GL11.glVertex2f(x + width, y + height);
            GL11.glVertex2f(x, y + height);
        GL11.glEnd();
        break;
    }
}
public void setRotation(float degrees) {
    // TODO: Fix whatever the hell the problem is here.
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glLoadIdentity();
    GL11.glTranslatef(x , y , 0);       
    GL11.glRotatef(degrees, 0f, 0f, 1f);

}
GL11.glTranslatef(x , y, 0);
GL11.glRotatef(degrees, 0f, 0f, 1f);
float rotValue = 0;
public void userLogic() {
    if (keyboard.isKeyDown(Keyboard.KEY_A)) {
        rect.setLocation(rect.x - 1, rect.y, rect.width, rect.height);
        rotValue-=.1f;
        rotValue=rotValue<0?rotValue+360:rotValue;
        rect.setRotation(rotValue);
    } else if (keyboard.isKeyDown(Keyboard.KEY_D)) {
        rect.setLocation(rect.x + 1, rect.y, rect.width, rect.height);
        rotValue+=.1f;
        rotValue=rotValue>=360?rotValue-360:rotValue;
        rect.setRotation(rotValue);
    } if (keyboard.isKeyDown(Keyboard.KEY_W)) {
        rect.setLocation(rect.x, rect.y - 1, rect.width, rect.height);
    } else if (keyboard.isKeyDown(Keyboard.KEY_S)) {
        rect.setLocation(rect.x, rect.y + 1, rect.width, rect.height);
    }
}
case RECTANGLE:
        GL11.glColor3f(colour.red, colour.green, colour.blue);
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex2f(-width/2, -height/2);
        GL11.glVertex2f(width/2, -height/2);
        GL11.glVertex2f(width/2, height/2);
        GL11.glVertex2f(-width/2, height/2);
        GL11.glEnd();
        GL11.glMatrixMode(GL11.GL_MODELVIEW); //resetting the rotation
        GL11.glLoadIdentity();  //and translation so that other
                                //objects are unaffected
            break;