1

我正在尝试将玩家的图像旋转到他们指向的位置。从技术上讲,这很好用。它把变换到中心后的图像沿Z轴旋转,然后再变换回来,没问题。

但是,当它被渲染时,当角度指向窗口的较宽部分时,图像会被挤压,就好像它试图按比例对图像进行归一化一样。如果我将分辨率设置为正方形(1080x1080、1440x1440 等),那么它可以正常工作,但是任何不是正方形的矩形分辨率都会使其播放器图像变形。

当我试图让环境围绕播放器的 x/y 坐标旋转时,我最初遇到了同样的问题,但是通过将 glViewport 设置为正方形来解决这个问题。

glViewport(0,0,width,width);

旋转 90 度时变形

不旋转时正常。

这些效果镜面分别为 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);   

}

不完全确定去哪里尝试解决这个问题,我自己对其他显然没有这个问题的人的研究只是导致脱发。如果需要更多代码或更多图像,请相信我,我会跪下寻求帮助。

4

2 回答 2

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,并且-1.78f 到 +1.78f 宽,宽高比为 16:9。这使得纹理贴图在旋转时变得奇怪,所以如果我按相反的比例缩放它以使其达到 1:1,旋转,然后缩小要达到比例比例,那么一切都很好。

希望我的解释是可以理解的。第一次玩这个,所以生活和学习。

于 2016-11-06T13:48:43.180 回答
-1

我相信您以高度为宽度调用drawTexture。

于 2016-11-03T12:19:57.823 回答