使用 glRotatef 旋转会导致变形
Rotating with glRotatef causes warping
我正在尝试将玩家的图像旋转到他们指向的位置。从技术上讲,这工作正常。它把图像变换到中心后沿Z轴旋转,再变换回来,没问题。
然而,在渲染时,由于角度指向 window 的宽阔部分,图像被压扁,就好像它试图按比例对图像进行归一化。如果我将分辨率设置为正方形(1080x1080、1440x1440 等),那么它可以正常工作,但任何非正方形的矩形分辨率都会使其播放器图像变形。
我最初在尝试让环境围绕玩家的 x/y 坐标旋转时遇到了同样的问题,但是通过将 glViewport 设置为正方形解决了这个问题。
glViewport(0,0,宽度,宽度);
Warped when rotated 90 degrees
Normal when not rotated.
这些效果分别镜像 270 度和 180 度,并逐渐在所有其他角度之间相互过渡。
Player.render()
的代码
glPushMatrix();
glTranslatef(
x/Main.width*2,
y/Main.height*2,
0);
glRotatef((float)angle,0f,0f,1f);
glTranslatef(
-x/Main.width*2,
-y/Main.height*2,
0);
drawTexture(t,x-w/2,y-w/2,w,w); //t = texture, w = width in pixels for texture to be mapped to
glPopMatrix();
以及 drawTexture 方法:
public static void drawTexture(Texture in,float x, float y,float w, float h) {
//Main.width and Main.height are the window window width and height.
float nx = x*2/Main.width;
float ny = y*2/Main.height;
float nw = w*2/Main.width;
float nh = h*2/Main.height;
in.bind(0);
glTexEnvf(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glDepthMask(false);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.0f,1.0f,1.0f,1.0f);
glBegin(GL_QUADS);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glTexCoord2f(0, 1);
glVertex2f(nx,ny);
glTexCoord2f(1, 1);
glVertex2f(nx+nw,ny);
glTexCoord2f(1, 0);
glVertex2f(nx+nw,ny+nh);
glTexCoord2f(0, 0);
glVertex2f(nx,ny+nh);
glEnd();
glDisable(GL_BLEND);
glDepthMask(true);
}
不确定去哪里尝试解决这个问题,我自己对其他显然没有这个问题的人的研究刚刚导致脱发。如果需要更多代码或更多图片,请相信我,我会竭诚为您提供帮助。
我相信你用高度作为宽度来调用 drawTexture。
在一个可爱的 5:30 早上,我想通了。
播放器渲染的固定代码原来是
glPushMatrix();
glTranslatef(
x/Main.width*2,
y/Main.height*2,
0);
glScalef(1f,(float)Main.width/Main.height,1f);
glRotatef((float)angle,0f,0f,1f);
glScalef(1f,(float)Main.height/Main.width,1f);
glTranslatef(
-x/Main.width*2,
-y/Main.height*2,
0);
drawTexture(t,x-w/2,y-w/2,w,w);
glPopMatrix();
(注意围绕旋转添加了缩放函数)。
必须添加这些,因为我在每个帧的开头添加了另一个缩放功能,缩放所有内容以在所有分辨率下看起来正常:
glScalef(1f,(float)Main.height/Main.width,1f);
因为否则它会将 300 像素的宽度视为 169 像素的高度,这是由于 LWJGL 采用比例浮点参数的方式(两个方向上的 -1f 到 +1f,此缩放函数将其更改为 -1f 到 +高度为 1f,宽度为 -1.78f 至 +1.78f,纵横比为 16:9。这使得纹理贴图在旋转时变得很奇怪,因此如果我按相反的比例缩放它以使其达到 1:1,旋转,然后缩小以达到缩放比率,然后一切正常。
希望我的解释足够容易理解。
第一次玩这个,边学边学。
我正在尝试将玩家的图像旋转到他们指向的位置。从技术上讲,这工作正常。它把图像变换到中心后沿Z轴旋转,再变换回来,没问题。
然而,在渲染时,由于角度指向 window 的宽阔部分,图像被压扁,就好像它试图按比例对图像进行归一化。如果我将分辨率设置为正方形(1080x1080、1440x1440 等),那么它可以正常工作,但任何非正方形的矩形分辨率都会使其播放器图像变形。
我最初在尝试让环境围绕玩家的 x/y 坐标旋转时遇到了同样的问题,但是通过将 glViewport 设置为正方形解决了这个问题。
glViewport(0,0,宽度,宽度);
Warped when rotated 90 degrees
Normal when not rotated.
这些效果分别镜像 270 度和 180 度,并逐渐在所有其他角度之间相互过渡。
Player.render()
的代码glPushMatrix();
glTranslatef(
x/Main.width*2,
y/Main.height*2,
0);
glRotatef((float)angle,0f,0f,1f);
glTranslatef(
-x/Main.width*2,
-y/Main.height*2,
0);
drawTexture(t,x-w/2,y-w/2,w,w); //t = texture, w = width in pixels for texture to be mapped to
glPopMatrix();
以及 drawTexture 方法:
public static void drawTexture(Texture in,float x, float y,float w, float h) {
//Main.width and Main.height are the window window width and height.
float nx = x*2/Main.width;
float ny = y*2/Main.height;
float nw = w*2/Main.width;
float nh = h*2/Main.height;
in.bind(0);
glTexEnvf(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glDepthMask(false);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.0f,1.0f,1.0f,1.0f);
glBegin(GL_QUADS);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glTexCoord2f(0, 1);
glVertex2f(nx,ny);
glTexCoord2f(1, 1);
glVertex2f(nx+nw,ny);
glTexCoord2f(1, 0);
glVertex2f(nx+nw,ny+nh);
glTexCoord2f(0, 0);
glVertex2f(nx,ny+nh);
glEnd();
glDisable(GL_BLEND);
glDepthMask(true);
}
不确定去哪里尝试解决这个问题,我自己对其他显然没有这个问题的人的研究刚刚导致脱发。如果需要更多代码或更多图片,请相信我,我会竭诚为您提供帮助。
我相信你用高度作为宽度来调用 drawTexture。
在一个可爱的 5:30 早上,我想通了。
播放器渲染的固定代码原来是
glPushMatrix();
glTranslatef(
x/Main.width*2,
y/Main.height*2,
0);
glScalef(1f,(float)Main.width/Main.height,1f);
glRotatef((float)angle,0f,0f,1f);
glScalef(1f,(float)Main.height/Main.width,1f);
glTranslatef(
-x/Main.width*2,
-y/Main.height*2,
0);
drawTexture(t,x-w/2,y-w/2,w,w);
glPopMatrix();
(注意围绕旋转添加了缩放函数)。 必须添加这些,因为我在每个帧的开头添加了另一个缩放功能,缩放所有内容以在所有分辨率下看起来正常:
glScalef(1f,(float)Main.height/Main.width,1f);
因为否则它会将 300 像素的宽度视为 169 像素的高度,这是由于 LWJGL 采用比例浮点参数的方式(两个方向上的 -1f 到 +1f,此缩放函数将其更改为 -1f 到 +高度为 1f,宽度为 -1.78f 至 +1.78f,纵横比为 16:9。这使得纹理贴图在旋转时变得很奇怪,因此如果我按相反的比例缩放它以使其达到 1:1,旋转,然后缩小以达到缩放比率,然后一切正常。
希望我的解释足够容易理解。 第一次玩这个,边学边学。