2016-11-03 62 views
1

我想旋轉玩家的圖像到他們指向的位置。從技術上講,這工作正常。它在轉換到中心後沿着Z軸旋轉圖像,然後轉換回去,沒問題。與glRotatef旋轉導致翹曲

但是,當渲染時,由於角度指向窗口的寬部分,圖像被擠壓,就好像它試圖按比例歸一化圖像。如果我將分辨率設置爲正方形(1080x1080,1440x1440等),那麼它可以正常工作,但任何不是正方形的矩形分辨率都會導致播放器圖像扭曲。

我原本在嘗試讓環境繞着玩家的x/y座標旋轉時遇到了同樣的問題,但是通過將glViewport設置爲正方形來解決此問題。

glViewport(0,0,width,width);

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); 

} 

不完全知道從哪裏去嘗試解決這個問題,我自己的研究別人,顯然沒有發生過這個問題剛剛導致脫髮。如果需要更多代碼或更多圖片,請相信我,我會跪下尋求幫助。

回答

1

在早晨5點半的時候,我明白了。爲玩家呈現

固定碼竟然是

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,在16:9方面寬度上爲-1.78f至+ 1.78f這使得紋理貼圖在旋轉時變得很奇怪,所以如果我通過相反的因子縮放到1:1,旋轉,然後縮小以獲得縮放比例,那麼一切都很好。

希望我的解釋完全可以理解。第一次玩這個,所以生活和學習。

-1

我相信你把hight稱爲drawTexture的寬度。

+0

drawTexture(t,x-w/2,y-w/2,w,w);這是你的代碼。最後一個參數是高度,但似乎是寬度。 –

+0

不知道你是什麼,但發現它很奇怪,因爲你的算法適用於平方分辨率,並且你傳遞的參數與寬度和高度相同。 –

+0

我使用它以防我爲了視覺效果任意拉伸紋理,或者紋理不是方形。紋理是正方形的,drawTexture的寬度和高度只是指定了我希望紋理映射到的矩形。所以我可以擁有相同的紋理,並使它在任何方向上變得更小或更大。 'w'用在兩者中,因爲我希望矩形在任一方向都是正方形,並將其設置爲寬度和高度相同的變量使得它更簡單。 – user7109452