2012-02-16 6 views
2

업데이트2D 텍스처를 회전하는 OpenGL

업데이트를 위해 하단을 참조하십시오.


나는 인터넷의 주위에 많이 찾고 있었어요 그리고 내가 달성하기 위해 노력하고있어 설명 할 몇 가지 자습서를 발견하지만 난이 일을 얻을 수없는, 어느 튜토리얼은 불완전하거나 적용 할 수 없습니다 내 코드에.

저는 원점 (중심)을 중심으로 2D 이미지를 회전시키는 것처럼 간단한 것을 시도하고 있습니다.

나는이 코드는 그것의에

GameRectangle dest = destination; 
Vector2 position = dest.getPosition(); 

glEnable(GL_TEXTURE_2D); 

glBindTexture(GL_TEXTURE_2D, this->image); 

//If the rotation isn't 0 we'll rotate it 
if (rotation != 0) 
{ 
    glMatrixMode(GL_TEXTURE); 

    glLoadIdentity(); 
    glTranslatef(0.5, 0.5, 0); 
    glRotatef(rotation, 0, 0, 1); 

    glMatrixMode(GL_PROJECTION); 
} 

glBegin(GL_QUADS); 
glTexCoord2d(xStart,yStart); 
glVertex2f(position.x, position.y); 

glTexCoord2d(xEnd,yStart); 
glVertex2f(position.x + this->bounds.getWidth(), position.y); 

glTexCoord2d(xEnd,yEnd); 
glVertex2f(position.x + this->bounds.getWidth(), position.y + this->bounds.getHeight()); 

glTexCoord2d(xStart,yEnd); 
glVertex2f(position.x, position.y + this->bounds.getHeight()); 

glEnd(); 

glDisable(GL_TEXTURE_2D); 

//Reset the rotation so next object won't be rotated 
glMatrixMode(GL_TEXTURE); 

glLoadIdentity(); 
glRotatef(0, 0, 0, 1); 

glMatrixMode(GL_PROJECTION); 

이 코드는 이미지를 그릴 것 같은 모습입니다이다 질감 0 또는 1

플립 XSTART, xend를, yStart 및 yEnd를 사용 원래 크기와 그것을 회전하지만 이미지를 많이 자르는 왼쪽 상단 모서리에서 회전합니다. GameRectangle.getOrigin()을 호출하면 직사각형의 중심을 쉽게 얻을 수 있지만 어디에서 사용할지 모릅니다. 넣으면

비트 :

glTranslatef(-0.5, -0.5, 0); 

내가 전화 후 :

glRotatef(0.5, 0.5, 0); 

그것은 중심에서 회전합니다,하지만 완벽한 90도 회전이 아니라면이 이미지를 스트레치한다.

UPDATE


거의 모든 가능한 노력 후, 나는 내가 찾던 결과를 얻었다.

하지만 이것이 최선의 방법인지 잘 모르겠습니다. 내 코드에 문제가 있는지 알려주세요.

위의 설명에서 언급했듯이 동일한 이미지를 여러 번 사용하고 값을 다르게하여 실제 이미지에 아무 것도 저장할 수 없습니다. 그래서 나는 그것을 렌더링 한 후에 매번 값을 재설정해야합니다.

나는이 내 코드를 변경 :

//Store the position temporary 
GameRectangle dest = destination; 
Vector2 position = dest.getPosition(); 

glEnable(GL_TEXTURE_2D); 

glBindTexture(GL_TEXTURE_2D, this->image); 

glTranslatef(dest.getOrigin().x, dest.getOrigin().y, 0); 
glRotatef(rotation, 0, 0, 1); 

glBegin(GL_QUADS); 
glTexCoord2d(xStart,yStart); 
glVertex2f(-dest.getWidth()/2, -dest.getHeight()/2); 

glTexCoord2d(xEnd,yStart); 
glVertex2f(dest.getWidth()/2, -dest.getHeight()/2); 

glTexCoord2d(xEnd,yEnd); 
glVertex2f(dest.getWidth()/2, dest.getHeight()/2); 

glTexCoord2d(xStart,yEnd); 
glVertex2f(-dest.getWidth()/2, dest.getHeight()/2); 

glEnd(); 

//Reset the rotation and translation 
glRotatef(-rotation,0,0,1); 
glTranslatef(-dest.getOrigin().x, -dest.getOrigin().y, 0); 

glDisable(GL_TEXTURE_2D); 

이 그것이,이 스트레치 또는 작물하지 않습니다에 그려 쿼드과 함께 텍스처를 회전합니다. 그러나 이미지가 사각형으로 채워지는 경우 가장자리가 약간 들쭉날쭉하지만, 앤티 엘리 어싱을 사용하지 않으면이를 피할 수는 없을 것입니다.

+4

당신이 정말로 텍스처가 아닌 쿼드을 회전 하시겠습니까? 이미 OpenGL 행렬을 사용하고있는 경우에는 코드 끝에 행렬을 재설정하는 대신 행렬 스택 (예 : glPushMatrix 및 glPopMatrix)을 사용해야합니다. –

+0

쿼드를 돌리면 충분합니다. 쿼드로 텍스처를 회전시키고 쿼드를 올바르게 회전시키는 방법은 무엇입니까? – Orujimaru

+0

또한 glPushMatrix() 및 glPopMatrix()를 호출해야하는 위치를 잘 모르겠습니다. 원하는 결과를 얻지 못하는 경우, 모든 이미지 또는 이미지를 회전시킵니다. 어떤 차이가 있는지 모르겠지만 동일한 이미지를 여러 번 그리지 만 회전 값이 다른 경우 다른 이미지를 그리면 실제 이미지에 아무 것도 저장할 수 없습니다. – Orujimaru

답변

1

당신이 원하는 것은 이것이다 :

glPushMatrix(); //Save the current matrix. 
//Change the current matrix. 
glTranslatef(dest.getOrigin().x, dest.getOrigin().y, 0); 
glRotatef(rotation, 0, 0, 1); 

glBegin(GL_QUADS); 
glTexCoord2d(xStart,yStart); 
glVertex2f(-dest.getWidth()/2, -dest.getHeight()/2); 

glTexCoord2d(xEnd,yStart); 
glVertex2f(dest.getWidth()/2, -dest.getHeight()/2); 

glTexCoord2d(xEnd,yEnd); 
glVertex2f(dest.getWidth()/2, dest.getHeight()/2); 

glTexCoord2d(xStart,yEnd); 
glVertex2f(-dest.getWidth()/2, dest.getHeight()/2); 

glEnd(); 

//Reset the current matrix to the one that was saved. 
glPopMatrix(); 
+0

네, 맞습니다. 감사합니다, – Orujimaru

+1

OpenGL ES 2.0에서 어떻게 이런 일이 벌어 질지 알고 있습니다. – peedee

관련 문제