我正在尝试将玩家的图像旋转到他们指向的位置。从技术上讲,这很好用。它把变换到中心后的图像沿Z轴旋转,然后再变换回来,没问题。
但是,当它被渲染时,当角度指向窗口的较宽部分时,图像会被挤压,就好像它试图按比例对图像进行归一化一样。如果我将分辨率设置为正方形(1080x1080、1440x1440 等),那么它可以正常工作,但是任何不是正方形的矩形分辨率都会使其播放器图像变形。
当我试图让环境围绕播放器的 x/y 坐标旋转时,我最初遇到了同样的问题,但是通过将 glViewport 设置为正方形来解决这个问题。
glViewport(0,0,width,width);
这些效果镜面分别为 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);
}
不完全确定去哪里尝试解决这个问题,我自己对其他显然没有这个问题的人的研究只是导致脱发。如果需要更多代码或更多图像,请相信我,我会跪下寻求帮助。