2010-12-07 3 views
4

인사말 모든 이미지에서 보듯OpenGL, 세계 대 객체 좌표 매핑? (역행렬)

,

alt text

I 객체라는 O (linestripes 세트) .Its 물체 좌표계 (X '인을 가지고 y ', z'). 내가 번역 는 코드 다음 사용하여 내 OpenGL을 현장에서이 객체를 회전 :

glPushMatrix(); 
glTranslatef(Oz, Oy,Oz); 
glRotatef(rotationX , 1.0, 0.0, 0.0); 
glRotatef(rotationY, 0.0, 1.0, 0.0); 
glRotatef(rotationZ, 0.0, 0.0, 1.0); 
contour->render(); 
glPopMatrix() 

;

내가

내가 올바른 생각하면

glPushMatrix(); 
glTranslatef(hx,hy,hz); 
glPopMatrix(); 
(오즈, 오이, 오즈) 및 (HX, HY을 사용하여 좌표 (HX, HY, Hz에서) 세계에 번역 H라는 점을 가지고, hz)는 세계 좌표입니다.

자, 제가하고 싶은 것은 O의 객체 좌표계에 비례하여 H (hx, hy, hz)의 위치를 ​​계산하는 것입니다. (x ', y', z '); 알다시피, 나는 객체 O의 역변환을 계산하고 이것을 점 H에 적용함으로써 이것을 할 수 있습니다.

어떤 팁이 있습니까? OpenGL은 역행렬 계산을위한 함수를 제공합니까? 만약 내가 어떻게 든 inverse-matrices를 발견한다면 그들을 곱하는 순서는 무엇인가?

참고 : 점 H에서 반지름 R을 가진 구를 그리는 공구와 같은 "해머"를 구현하고 싶습니다. 사용자가이 구를 사용하여 망치처럼 객체 O를자를 수 있습니다 .2 차원에서 이렇게 구현했습니다. 해머 위치를 계산할 수 있다면 같은 알고리즘을 사용할 수 있습니다 (x ', y', z ')에 상대

미리 감사드립니다.

+1

내가 당신의 질문을 이해한다면'{Ox-hx, Oy-hy, Oz-hz} '(즉'glTranslatef (Ox-hx, Oy-hy, Oz-hz))? 전역 벡터'O'와'h'를 이미 가지고 있다면 그것은 벡터 빼기의 간단한 문제입니다. 행렬 조작을 방정식에서 완전히 벗어나게 만듭니다. 그런데 원래 솔루션이 올바르게 들립니다. – MrGomez

+0

안녕하세요, 나는 오리지널 오브젝트 좌표를 변경해야만합니다. 즉, 세계 좌표가 아닌 오브젝트 좌표를 비교해야합니다. –

+1

걱정할 필요가 없습니다. OpenGL이 범용 행렬 라이브러리를 제공하지 않는다는 것을 재빨리 생각해 보았습니다. 별도의 라이브러리를 사용하거나 계산 (http://mathworld.wolfram.com/MatrixInverse.html)을 직접 수행해야합니다. – MrGomez

답변

2

행렬을 반전하는 것이 일반적인 해결책이 될 수 있지만 이것이 실제로 볼 수있는 한 "일반적인"문제는 아닙니다. 임의의 변환을 실행 취소하는 대신 변환의 알려진 시퀀스를 역으로 수행하려고합니다. 각 변환은 매우 간단하게 변환 할 수 있습니다. 개체 - 투 - 세계 변환 인 경우 :

glTranslatef(Ox, Oy, Oz); 
glRotatef(rotationX , 1.0, 0.0, 0.0); 
glRotatef(rotationY, 0.0, 1.0, 0.0); 
glRotatef(rotationZ, 0.0, 0.0, 1.0); 

는 그런 세계에 객체 역은이다 : 기본적으로

glRotatef(-rotationZ, 0.0, 0.0, 1.0); 
glRotatef(-rotationY, 0.0, 1.0, 0.0); 
glRotatef(-rotationX , 1.0, 0.0, 0.0); 
glTranslatef(-Ox, -Oy, -Oz); 

, 그냥 각각의 원래 적용 반대 순서 변환을 적용 밖으로.

2

예, 기본적으로 당신이있어 당신이 번역 행렬

M = O^-1 * H

을이 작업을 수행 할 수있는 바로 당신 같은 어떤 이미 이것에 대한 O의 역을 필요로 추측 . OpenGL은 수학 라이브러리가 아니지만 렌더링 만 처리합니다. 따라서 자신을 반전시켜야합니다. Google은 "Gauss Jordan"을 사용하여 가능한 알고리즘을 찾습니다. 만약 당신이 절대적으로 확신 할 수 있다면, 그 O는 오직 회전과 이동, 즉 가위 나 스케일링이 없기 때문에, 왼쪽 상단의 3x3 부분 행렬을 바꾸고 가장 오른쪽 열의 맨 위 3 요소를 음수로 바꿀 수 있습니다 (이것은 직각 회전 행렬과 같은 행렬은 전치가 역도이고, 왼쪽 위의 3x3이 회전 부분이고, 역변환은 맨 위의 3 개의 요소 인 벡터의 요소를 무효화합니다.