2012-02-17 5 views
3

나는 점에 원점을 기준으로 한 x, y, z라고하는 말을 붙입니다.
포인트에 회전, 평행 이동 등의 변형을 적용하고 변형 된 점에서 객체를 렌더링하고 싶습니다. glTranslatef()glRotatef() 함수를 사용하고 있습니다.OpenGL 변환

glTranslatef(x,y,z); 
glRotatef(Ang,0,1,0); // rotated around Y axis at an arbitrary angle 
glTranslatef(xt,yt,zt); // further translation 
<render the object> 

그것은 복잡한 행렬 변환 작업에서 저를 저장하더라도, 나는 기원에 대한 최종 위치의 좌표 값을 실제의 인식 해요 : 그것은 무엇과 같은 몇 가지를 보인다. 행렬 연산을 거치지 않고 변환 된 점의 실제 위치 좌표를 검색하는 방법이 있습니까?

+0

에서 무엇을하고 싶습니까? 주어진 좌표에 개체를 그리거나 자신과 같이 그릴 수 있습니다. 예를 들어, 어쨌든 그것이 어디에서 끝나는 지 아십니까? –

+0

변환 된 좌표를 알고 변환 된 위치에 객체를 그릴 필요가 있습니다. – itsraining

+0

@flopcoder 수정 한 문제를 원래의 질문으로 되돌려 놓은 이유는 무엇입니까? 예를 들어 OpenGL이 아닌 OpenGL입니다. – Bart

답변

3

당신은 glGetDoublev를 사용하여 OpenGL은 상태에서 매트릭스를 검색 할 수 있습니다

GLdouble projectionMatrix[16]; 
glGetDoublev(GL_PROJECTION, projectionMatrix); 

GLdouble modelViewMatrix[16]; 
glGetDoublev(GL_MODELVIEW, modelViewMatrix); 

이 또한주의, 당신도 처음으로 번역 한 다음 번역 벡터를 회전하고, 회전 때. 일반적으로 원점에서 객체를 회전 한 다음 변환하여 회전 끝점에서 회전 된 객체를 만듭니다.

편집 : 나는 작업의 이러한 종류의 glm을 사용하는 것이 좋습니다

p' = projectionMatrix * modelViewMatrix * p 

:이 변환 된 좌표를 P '을 얻으려면, 당신이 그 행렬을 사용하여 포인트 페이지을 변환해야합니다.

+0

감사합니다. 시도해 볼게 – itsraining

12

먼저 이론을 알려 드리겠습니다. OpenGL은 행렬 4x4과 길이가 4 (3D 단위) 인 벡터 (점 좌표)로 작동합니다.

벡터 X = (x,y,z,1)을 가집니다. 너 multiply matrixes하는 법을 알기를 바랍니다. 그리고 포인트를 V = (vx,vy,vz)으로 번역하고 싶다고 가정 해 봅시다.

Translation matrix

그리고 당신은 두 개의 행렬 (매트릭스 * 벡터/점) 곱합니다 : 는이 같은 translation matrix를 구축해야합니다 그렇게하려면 Y = TX :

Translation via matrix

을 이렇게 복잡하게하는 이유는 (단지 X + V을 추가하는 것뿐만 아니라) 동일한 매트릭스에 다른 값을 채우는 것만으로 축 주위로 포인트를 회전시킬 수 있다는 것입니다. rotation matrix를 불렀다 :

Rotation matrices

가장 좋은 부분은 당신이 체인 그 행렬 수 있다는 것입니다.당신이 그 규칙에 지점을 그릴 필요가있을 때 :

  • 당신은 한 번에 모든 일을 할 것 하나 행렬을 준비 할 수 T1
  • 회전이 R1
  • T2

를 번역 : F = T1R1T2

그리고 모든 변환을 poin에 적용하는 것보다 한 번에 : Y = FX.

매트릭스 곱셈이 commutative이 아니므로 주문이 중요합니까?입니다.

OpenGL은 이러한 행렬과 함께 작동합니다 (scale matrix과 같은 유형이 몇 개 더 있음).

glGetDoublev(GL_MODELVIEW_MATRIX, redTransformationMatrix); 

그리고 여기에 제대로 그 데이터를 표현하는 방법 (자세한 정보 here) : 당신은 명령을 사용하여 현재 변환 행렬 (here에서 예)를 얻을 수있는 마지막을 제외하고

enter image description here

모든 이미지 하나는 wikipedia.org