2014-10-13 3 views
0

저는 3 차원 공간에 비행기를 가지고 있으며 다른 곳으로 옮기고 싶습니다. 그래서 glTranslate를 사용합니다.C++ OpenGL은 glTranslatef 후에 새로운 버텍스 위치를 얻습니다.

플레인 정점 데이터는 (0,0,0), (1,0,0), (1,1,0) 및 (0,1,0)입니다. glTranslatef (2.0, 0.0, 0.0)를 사용하여 객체를 (2,0,0)의 위치로 변환합니다.

번역 후 점 데이터가 변경되지 않으므로 평면과 충돌하려면 시각적 위치가 실제 위치가 아닙니다.

MODELVIEW_MATRIX에서 포인트 데이터를 얻는 방법이 있습니까, 아니면 적어도 glTranslate 이후에 새로운 값이 무엇인지 알아낼 방법이 있습니까?

실제 값을 2.0으로 추가하여 응답하지 마십시오. 왜냐하면 glRotate 등을 사용하고 싶다면 무엇 때문에 포인트 값 위치를 원하기 때문입니다.

+0

실제 값에 2.0을 추가해야합니다. 객체를 회전 시키려면,'glTranslate'를 사용하여 객체를 원점으로 옮기고,'glTranslate'를 다시 움직이면됩니다. – molbdnilo

답변

0

, 당신은 함께 현재 모델 뷰 행렬을 얻을 수 있습니다 :

GLfloat mat[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, mat); 

그런 다음 표준 행렬 곱셈으로 정점에이 행렬을 적용 할 수 있습니다. 행렬은 열 - 주 순서로 배열된다는 것을 명심하십시오. 입력 벡터 xIn으로 변환 된 벡터 xOut은 다음과 같습니다 자신의 코드에서 현재의 변환 행렬의

xOut[0] = mat[0] * xIn[0] + mat[4] * xIn[1] + mat[8] * xIn[2] + mat[12]; 
xOut[1] = mat[1] * xIn[0] + mat[5] * xIn[1] + mat[9] * xIn[2] + mat[13]; 
xOut[2] = mat[2] * xIn[0] + mat[6] * xIn[1] + mat[10] * xIn[2] + mat[14]; 

를 추적하려면 정말 더 나은 방법, 이럴입니다. 성능에 해를 끼칠 수있는 glGet() 호출을 제거하는 것 외에도, 매트릭스 스택 및 모든 관련 호출이 더 이상 존재하지 않는 최신 OpenGL (코어 프로파일)을 사용할 수있는 길을 열어줍니다.

0

변환 및 회전에서 행렬을 만들 수 있으므로 행렬을 사용하여 좌표를 변환 할 수 있습니다. 이러한 행렬을 만들고 좌표를 변환하는 데 도움이되는 많은 라이브러리가 있습니다. 당신이 정말로 자신의 변환 행렬을 유지하지 않으려면