2016-11-03 2 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시 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(); 

(회전에 주위 스케일링 기능의 추가를 참고)로 밝혀졌다. 그렇지 않으면 높이가 169 픽셀로 폭이 300 개 픽셀을 처리하므로,

 glScalef(1f,(float)Main.height/Main.width,1f); 

: 사람들은 내가 모든 해상도에서 정상 보는 모든 것을 조정 각 프레임의 시작 부분에 또 다른 확장 기능을 추가하기 때문에 추가 할 수 있었다 LWJGL이 비례 부동 인수 (양방향에서 -1f에서 + 1f까지 사용되는 방식)로 인해이 배율 함수는 높이가 -1f에서 + 1f로 변경되고 16 : 9 애스펙트에서는 -1.78f에서 + 1.78f로 변경됩니다 비율로 바뀌 었습니다. 회전 할 때 텍스처 맵을 이상하게 만들었습니다. 따라서 반대 요소로 스케일을 조정하여 1 : 1로 설정 한 다음 회전하여 비율을 조정하면 모든 것이 잘됩니다.

잘하면 내 설명 ation은 충분히 이해할 수 있습니다. 처음으로 이걸 가지고 노는, 그래서 살고 배웁니다.

-1

너는 hight를 width로 사용하여 drawTexture를 호출한다고 나는 믿는다.

+0

drawTexture (t, x-w/2, y-w/2, w, w); 그것은 당신의 코드입니다. 마지막 인수는 높이이지만 너비 인 것처럼 보입니다. –

+0

너는 무엇인지 알지 못하지만 알고리즘이 정사각형 해상도로 작동하고 너비와 높이와 같은 매개 변수를 전달하면 이상하다는 것을 알게된다. –

+0

시각 효과를 위해 텍스처를 임의로 늘리거나 텍스처가 정사각형이 아닌 경우에 사용합니다. 텍스처는 정사각형이고, drawTexture 너비와 높이는 텍스처를 매핑하고자하는 사각형을 지정합니다. 그래서 나는 같은 질감을 가지고 그것을 날고있는 어느 방향으로나 작게 만들 수 있습니다. 'w'는 사각형을 양쪽 방향으로 정사각형으로 만들고 너비와 높이가 같은 변수로 설정하면 간단 해집니다. – user7109452

관련 문제