2012-03-06 1 views
2

gluOrtho2D()로 설정된 행렬을 사용하여 모든 렌더링을 수행하는 프로그램에서 엉망입니다. 내가 뭘하고 싶은 건 원래의 행렬이 gluPerspective()에 의해 제공된 것처럼 보이게 Y 축 (0,1,0)을 중심으로 특정 텍스처를 회전시키는 것이다. 이것은 정사영 투영 행렬로는 가능하지 않으며 새로운 투영 투영 행렬을 설정해야한다는 것을 알고 있습니다. 직사각형 매트릭스로 그릴 때와 똑같이 보이도록 텍스처를 원한다. 때로는 y 축을 중심으로 회전시킬 때를 제외하고.
가 어떻게 모양이 XY 평면에 그려 때 주어진 직교 행렬에 해당하는 원근 투영 행렬을 찾을 수 있습니까하지만, XY 평면에서 나에게 관점을 제공하지 않을 때 : 직교 행렬과 같은 투영 행렬을 어떻게 찾을 수 있습니까? xy 평면이 아닐 때 원근감을 제공합니까?

그래서 요약하면?

+0

왜 이것을하고 싶습니까? – Nobody

+0

요약 내용이 이전에 나에게 들려주는 메모와 매우 다른 것으로 들립니다. – Nobody

+0

위의 노트는 약간 불명확 할 수도 있지만 모두 요약되어 있습니다. 모든 렌더링에 대해 직교 투영법을 사용하는 대용량 프로그램에서 원근 투영을 얻고 싶지만 최소 코드 양은 변경하고 싶습니다. 제가 컴퓨터 비전 강의 마지막 과정을 수강 한 지 2 년이 지났기 때문에 녹슨 느낌이 들었습니다. – Leo

답변

4

기본적으로 내가 이해하는 것은 다음과 같습니다. 오브젝트가 XY 평면에있는 경우 직교 투영과 동일한 이미지를 생성하는 원근 매트릭스를 원합니다.

시작하자. 평면을 XY 평면에 그리고 싶다면 gluOrtho2D(-w, w, -h, h); (비대칭 정 투영 이미지가 필요할 경우 조금 더 세게 말하기). 당신이 지금해야 할 것은 :

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(2 * atan(h/2), w/h, 1, 3); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0, 0, -2); 

내가이 직교 투영에서 볼 수 있던 XY 평면의 섹션에 투영 뷰 프러스 텀의 중심을 일치 여기에 다있다.

투사 frustums 일부 수학의 그래프를 가지고 당신이 스스로 할 수있는 :)

는 그냥 신호로 여기 오래된 질문에 대한 내 대답을 떠날 것이다.

정사영 또는 원근 투영을 사용합니다. 당신은 하나를 결정해야합니다. 임의의 축에서 회전하여 원근감을 얻지 못합니다.

왜 투영 모드를 변경하기 위해 전체 프로그램을 변경해야합니까?

한 가지 가능한 솔루션

:

glMatrixMode(GL_PROJECTION); //switch to projection matrix mode 
glPushMatrix(); //push the old matrix 
glLoadIdentity(); 
//apply the perspective projection 
//do your rendering 
glPopMatrix(); //pop the old matrix 
당신이 당신 자신이 대부분의 작업을 수행해야합니다 새로운 GL 방식으로

하지만이 용이해야한다 : 나는 등 다른 매트릭스 모드와 함께 기존의 GL을 가정 그래도.

+0

불충분하게 작성된 질문입니다. 이제 업데이트되었습니다. – Leo

+0

프로그램에서 보이는 투영 행렬을 바꾸기 위해 텍스처를 그릴 때 프로그램이 너무 많은 작업을하고 있기 때문에이 아이디어를 포기하고 내 렌더링 코드를 작성해야합니다. 이 질문에 대한 답변을했지만 gluPerspective (2 * atan (h/2), w/h, 1, 3)하지 않아야합니까? – Leo

+0

@ 레오 : 당신이 바로 그 '2 * atan'에 대해 나는 그것을 바로 잡을 것입니다. 다른 문제에 관하여 : 나의 "오래된"해결책은 오래된 매트릭스를 저장하고 후후 복원을 위해 무엇을해야하는지 알려줍니다. – Nobody

0

gluPerspective()를 사용하여 모든 프로그램을 변환하지 않고도 쉽게이 작업을 수행 할 수 있습니까?

이미이 이야기의 피곤하지만 해요 :

투사하는 것은 뭔가 정의를 한 번 한 후 전체 렌더링 프로세스에 적용되지 않습니다. 언제든지 원하는대로 전환 할 수 있으며, 모든 고급 렌더링 구성표가 단일 프레임에서 여러 번이를 수행합니다.

나는 대부분의 초보자이 혼동 생각 :

reshape(width, height): 
    glViewport(0,0,width,height) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    projection_setup() 

그들은 모양 변경 기능에서 수행 투사를보고 그것을 할 수있는 유일한 장소라고 생각한다. 나와 이야기하십시오. 투영 행렬은 다른 것으로 그리는 데 사용되는 일부 상태입니다. 현재 색상이나 질감처럼 쉽게 변경할 수 있습니다.

그림을 그리기 바로 전에 필요한대로 그리기 명령의 특정 순서에 필요한 투영을 설정하기 만하면됩니다.

+0

죄송합니다. 서두른 이래로 저의 질문이 저조했습니다. 내가 원했던 것은 xy 평면에 그려진 객체를 오래된 정사영 행렬과 동일한 모양으로 제공하지만 xy 평면에없는 객체에 투시 투영을 제공하는 투영 행렬입니다. – Leo

0

그것은가 투영 매트릭스가 정 투영하더라도, X 또는 Y 축 주위 회전을 원근 효과, 예를 가질 수 있고, 트릭 전/마법 매트릭스 여러 뷰 매트릭스이고 다른 뷰 변환 후 :

// The matrix is 
// -z, 0, x, 0 
// 0, -z, y, 0 
// 0, 0, 1, 0 
// 0, 0, 1, -z 

:

  • x 뷰포트 절반 폭이고,
  • y
  • ,691 절반 높이 뷰포트
  • z은 -0을 제외한 모든 음수 일 수 있습니다.

몇 가지주의 사항 :이 내장 된 호출이 오른쪽 곱셈만큼

  1. 유 glRotate *를 호출 r에 경우는,이 ​​행렬 먼저 간다. 교과서에 제안 된대로 왼손 곱셈을 사용하여 자신의 뷰 행렬을 추적하면이 행렬이 마지막으로됩니다. 어느 쪽이든,이 행렬은 실제로 정사영 프로젝트 행렬에 곱해질 것입니다. 따라서 미리 계산할 수 있습니다.
  2. z는 실제로 시뮬레이션 된 z 깊이이므로 크기가 클수록 더 많은 객체가 결과로 생성됩니다. 회전은 정사각형과 비슷해 보입니다. Z는 긍정 할 수 없습니다. 이것은 NDC가 부정적 일 때 w를 만들 것이기 ​​때문입니다. OpenGL은 허용하지 않으므로 잘려서 아무것도 그려지지 않을 것입니다.
  3. 마지막으로 마술은 없습니다.이 행렬은 단지 보상 일뿐입니다. M (ortho) XM (magic), 전망 매트릭스를 얻으십시오
  4. 이 트릭은 코드의 99 %가 직교를위한 것이지만 한 개 또는 두 개의 원근감 효과가 필요하다면 중요합니다. 그러면 사이를 전환 할 필요가 없습니다 UR 고정 파이프 라인을 사용, GL_PROJECTION_MATRIX가 변경되지 않을 경우 두 가지 모드,
  5. 이 행렬이는 U에게 많은 신뢰를 줄 것이다 그래서 희망 안드로이드 오픈 소스 프로젝트에서 가져