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