2012-02-22 2 views
0

이것은 이전에 여러 번, 여러 번 요청되었으며 인터넷에서 많은 게시물과 포럼을 읽었지만 하나만 가져올 수 없습니다. 자신의 축을 중심으로 회전하는 객체입니다. 나는 여러 같은 개체를 끌어 있습니다OpenGL에서 자신의 축을 중심으로 푸시/팝 매트릭스 및 개별 객체 회전

gl.glMatrixMode(GL2.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
..... 
gl.glPushMatrix(); 
     gl.glRotatef(angle, 0.0f, 1.0f, 0.0f); 
     gl.glTranslatef(0.0f, 0.0f, 0.0f); 
     texture.bind(gl); 
     gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt); 
     gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt); 
     gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt); 
     gl.glDrawElements(GL2.GL_TRIANGLES, countI, GL2.GL_UNSIGNED_SHORT, indexRLt); 
     gl.glPopMatrix(); 

을 그리고 glRotatef 먼저 그 이유는 그래서이,

나는 OpenGL을 역방향으로 명령을 실행합니다 알고 ... 모든 텍스처 및 적용 법선, 제대로 그려집니다. 또한 나는 모든 회전이 원점 주위에 있다는 것을 알고 있습니다. 그래서 나는 모든 객체를 그리기 전에 행렬을 저장하기 때문에 "펜"이 이미 원점에 있기 때문에 그 원점으로 객체를 변환해야합니다. 나중에 그것을 팝하십시오). glDrawElements에서 뭔가가 있습니까? 뭔가 옳지 않은 것처럼 보입니다.

도움이 될 것입니다. :)

편집 : 개체가 주 x 축을 중심으로 회전하는 방식을 볼 수 있지만 로컬 x 축을 중심으로 회전 시키길 원합니다.

+5

그것은 그 OpenGL은 아니다는 "역 명령을 실행한다"는 변환 행렬을 구성하는 방법이다. – andrewmu

+0

당신이하고 싶은 것은 조작이 전 세계가 아니라 지역적으로 적용된 것으로 생각하는 것입니다. 따라서 예를 들어 로컬 Y 축을 중심으로 회전 한 다음 새 좌표계로 변환합니다. 회전을보다 로컬하게하려면 나중에 수행해야합니다. 그러나 귀하의 예에서는 번역이 0이므로 효과가 없으며 순서는 중요하지 않습니다. 어쩌면 당신은 단지 객체의 축이 무엇인지 오해하고 있습니다. –

답변

0

"OpenGL은 명령을 역으로 실행합니다."는 왼쪽이 아닌 오른쪽에서 변환 행렬을 곱하는 것을 의미합니다. 이것은 무엇을 의미 하는가?

변환 A와 B 상상 :

// sudo code: 
glA() 
glDraw(x) 

지금, 보통, 프로그래밍 당신은 당신이 얻을 생각 : A 및 수율에 의해

y = Ax 

변환 x 것은 y

이에 해당합니다 당신이 그들을 쓰는 순서대로 변형. 그래서, 당신은

glA() 
glB() 
glDraw(x) 

당신에게

y = BAx 

을 줄 것이라고 생각 하지만 잘못된 것입니다. 당신은 실제로 얻을 :이 먼저 B이 결과에 다음 Ax에 적용되는 것을 의미

y = ABx 

.

영어로 넣고,이 예를 살펴 :

// When everything is drawn, move them to destination: 
gl.glTranslatef(destination[0], destination[1], destination[2]); 
// For every object, rotate it the way it should, then restore transformation matrix 
// object: RLt 
gl.glPushMatrix(); 
    gl.glRotatef(angle, 0.0f, 1.0f, 0.0f); 
    texture.bind(gl); 
    gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt); 
    gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt); 
    gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt); 
    gl.glDrawElements(GL2.GL_TRIANGLES, countI, GL2.GL_UNSIGNED_SHORT, indexRLt); 
gl.glPopMatrix(); 
// object: RLt2 
gl.glPushMatrix(); 
    gl.glRotatef(angle2, 0.0f, 1.0f, 0.0f); 
    texture.bind(gl); 
    gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, textureRLt2); 
    gl.glNormalPointer(GL2.GL_FLOAT, 0, normalRLt2); 
    gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vertexRLt2); 
    gl.glDrawElements(GL2.GL_TRIANGLES, countI2, GL2.GL_UNSIGNED_SHORT, indexRLt2); 
gl.glPopMatrix(); 
+1

@Shahbaz 빠른 반응에 감사드립니다! 불행히도 나는 그것을 시도했다. (다시 한번 시도해 보았지만, 확실하게했다.) 효과는 같다. ( 그림을 그리기 전에 gl.glTranslatef (0.0f, 0.0f, 0.0f)를 추가했다. OpenGL의 용어들, 모든 것을 그려 본 후에) - 처음에는 효과가 동일하다 : 객체 중 하나만 회전하기도하지만 꼭지점 배열 대신 glBegin으로 그려지는 이상한 점이있다. – Peter

+1

glTranslatef (0, 0, 0)는 객체를 원점으로 가져 오지 않으며, 기본적으로 (0, 0, 0)만큼 이동합니다. 기본적으로 아무것도하지 않습니다. 객체가 (x, y, z) (-x, -y, -z)로 변환해야합니다. 이전 변환에 회전 및 크기 조정이 포함되어 있으면이 작업이 매우 복잡해질 수 있습니다.이 경우 가장 좋은 방법은 OpenGL에서 변환 행렬을 얻는 것입니다. 번역 부분과 역함을 수행하십시오. – Shahbaz

+0

나는 그런 것을 의심했습니다. 간단한 작업을하기위한 복잡한 작업 : D – Peter

0

난 당신이 업데이트 여부 ', 확실하지 않다 :

glScalef(...)   // third, scale the whole thing 
glTranslatef(...)  // second, translate it somewhere 
glRotatef(...)   // first, rotate the object (or course, 
         // around its own axes, because the object is at origin) 
glDrawElements(...) // draw everything at origin 

그럼, 당신이해야 할 것은 작성하는 것입니다 각도 '변수를 주기적으로 설정합니다. 그렇지 않으면 회전이 없습니다. 의사 코드는 아래와 같습니다. 변수의 주기적 갱신을 위해 gluttimerfunc를 사용할 수 있습니다. (모든 루프는 OpenGL)

각도 + = 5

.0F

사티

관련 문제