我试图将播放器的图像旋转到他们指向的位置。从技术上讲,这很好。它转换到中心后沿Z轴旋转图像,然后转换回来,没问题。
然而,当渲染时,当角度指向窗口的宽部分时,图像会被挤压,就像它试图按比例标准化图像一样。如果我将分辨率设置为正方形(1080x1080,1440x1440等),那么它可以正常工作,但任何不是方形的矩形分辨率都会让它的播放器图像变形。
我试图让环境围绕播放器的x / y坐标旋转时遇到同样的问题,但这是通过将glViewport设置为正方形来解决的。
glViewport(0,0,宽度,宽度);
Warped when rotated 90 degrees
这些效果分别为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);
}
不确定在哪里尝试解决这个问题,我自己研究其他显然没有出现这个问题的人只是导致了脱发。如果需要更多代码或更多图片,相信我,我会跪在地上寻求帮助。
答案 0 :(得分:1)
早上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 in高度,宽度为-1.78f到+ 1.78f,宽高比为16:9。这使得纹理贴图在旋转时很奇怪,所以如果我按相反的因子缩放它以使其达到1:1,旋转,然后缩小以达到比例然后一切都很好。
希望我的解释是可以理解的。 第一次玩这个,所以生活和学习。
答案 1 :(得分:-1)
我相信你以高度为宽度调用drawTexture。