gluOrtho2D()로 설정된 행렬을 사용하여 모든 렌더링을 수행하는 프로그램에서 엉망입니다. 내가 뭘하고 싶은 건 원래의 행렬이 gluPerspective()에 의해 제공된 것처럼 보이게 Y 축 (0,1,0)을 중심으로 특정 텍스처를 회전시키는 것이다. 이것은 정사영 투영 행렬로는 가능하지 않으며 새로운 투영 투영 행렬을 설정해야한다는 것을 알고 있습니다. 직사각형 매트릭스로 그릴 때와 똑같이 보이도록 텍스처를 원한다. 때로는 y 축을 중심으로 회전시킬 때를 제외하고.
가 어떻게 모양이 XY 평면에 그려 때 주어진 직교 행렬에 해당하는 원근 투영 행렬을 찾을 수 있습니까하지만, XY 평면에서 나에게 관점을 제공하지 않을 때 : 직교 행렬과 같은 투영 행렬을 어떻게 찾을 수 있습니까? xy 평면이 아닐 때 원근감을 제공합니까?
답변
기본적으로 내가 이해하는 것은 다음과 같습니다. 오브젝트가 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을 가정 그래도.
불충분하게 작성된 질문입니다. 이제 업데이트되었습니다. – Leo
프로그램에서 보이는 투영 행렬을 바꾸기 위해 텍스처를 그릴 때 프로그램이 너무 많은 작업을하고 있기 때문에이 아이디어를 포기하고 내 렌더링 코드를 작성해야합니다. 이 질문에 대한 답변을했지만 gluPerspective (2 * atan (h/2), w/h, 1, 3)하지 않아야합니까? – Leo
@ 레오 : 당신이 바로 그 '2 * atan'에 대해 나는 그것을 바로 잡을 것입니다. 다른 문제에 관하여 : 나의 "오래된"해결책은 오래된 매트릭스를 저장하고 후후 복원을 위해 무엇을해야하는지 알려줍니다. – Nobody
gluPerspective()를 사용하여 모든 프로그램을 변환하지 않고도 쉽게이 작업을 수행 할 수 있습니까?
이미이 이야기의 피곤하지만 해요 :
투사하는 것은 뭔가 정의를 한 번 한 후 전체 렌더링 프로세스에 적용되지 않습니다. 언제든지 원하는대로 전환 할 수 있으며, 모든 고급 렌더링 구성표가 단일 프레임에서 여러 번이를 수행합니다.
나는 대부분의 초보자이 혼동 생각 :
reshape(width, height):
glViewport(0,0,width,height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
projection_setup()
그들은 모양 변경 기능에서 수행 투사를보고 그것을 할 수있는 유일한 장소라고 생각한다. 나와 이야기하십시오. 투영 행렬은 다른 것으로 그리는 데 사용되는 일부 상태입니다. 현재 색상이나 질감처럼 쉽게 변경할 수 있습니다.
그림을 그리기 바로 전에 필요한대로 그리기 명령의 특정 순서에 필요한 투영을 설정하기 만하면됩니다.
죄송합니다. 서두른 이래로 저의 질문이 저조했습니다. 내가 원했던 것은 xy 평면에 그려진 객체를 오래된 정사영 행렬과 동일한 모양으로 제공하지만 xy 평면에없는 객체에 투시 투영을 제공하는 투영 행렬입니다. – Leo
그것은가 투영 매트릭스가 정 투영하더라도, 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을 제외한 모든 음수 일 수 있습니다.
몇 가지주의 사항 :이 내장 된 호출이 오른쪽 곱셈만큼
- 유 glRotate *를 호출 r에 경우는,이 행렬 먼저 간다. 교과서에 제안 된대로 왼손 곱셈을 사용하여 자신의 뷰 행렬을 추적하면이 행렬이 마지막으로됩니다. 어느 쪽이든,이 행렬은 실제로 정사영 프로젝트 행렬에 곱해질 것입니다. 따라서 미리 계산할 수 있습니다.
- z는 실제로 시뮬레이션 된 z 깊이이므로 크기가 클수록 더 많은 객체가 결과로 생성됩니다. 회전은 정사각형과 비슷해 보입니다. Z는 긍정 할 수 없습니다. 이것은 NDC가 부정적 일 때 w를 만들 것이기 때문입니다. OpenGL은 허용하지 않으므로 잘려서 아무것도 그려지지 않을 것입니다.
- 마지막으로 마술은 없습니다.이 행렬은 단지 보상 일뿐입니다. M (ortho) XM (magic), 전망 매트릭스를 얻으십시오
- 이 트릭은 코드의 99 %가 직교를위한 것이지만 한 개 또는 두 개의 원근감 효과가 필요하다면 중요합니다. 그러면 사이를 전환 할 필요가 없습니다 UR 고정 파이프 라인을 사용, GL_PROJECTION_MATRIX가 변경되지 않을 경우 두 가지 모드,
- 이 행렬이는 U에게 많은 신뢰를 줄 것이다 그래서 희망 안드로이드 오픈 소스 프로젝트에서 가져
왜 이것을하고 싶습니까? – Nobody
요약 내용이 이전에 나에게 들려주는 메모와 매우 다른 것으로 들립니다. – Nobody
위의 노트는 약간 불명확 할 수도 있지만 모두 요약되어 있습니다. 모든 렌더링에 대해 직교 투영법을 사용하는 대용량 프로그램에서 원근 투영을 얻고 싶지만 최소 코드 양은 변경하고 싶습니다. 제가 컴퓨터 비전 강의 마지막 과정을 수강 한 지 2 년이 지났기 때문에 녹슨 느낌이 들었습니다. – Leo