tl; dr : 투영 형상의 수학 문제 : 아래 그림과 같이 투영을 제공하는 4x4 카메라 매트릭스를 어떻게 찾아서 점 A, B, C, D가 장치 상자의 가장자리에있을 수 있습니다 (예 : OpenGL 표준화 장치) 좌표), 단위 상자의 모서리가 광선 EA, EB, EC, ED를 따라 합리적입니까?
(이는 호모 그래피, 관점 및 / 또는 콜린 레이션의 특별한 경우 일 수 있습니다. 용어에 익숙하지 않습니다.)
동화
뷰포트 내에 사변형 ABCD가 주어지면 사각형으로 다시 매핑하는 고유 (?) 변환이 있다고 생각합니다. 아래 이미지에서 볼 수 있듯이 : 뷰포트의 사변형 ABCD는 물리적 인 '창'역할을하며 사각형으로 다시 매핑하면 왜곡되어 나타납니다.
(오른쪽의 상자는 NDC를 나타내며, 나중에 이야기하겠습니다)
목표는 오른쪽의 이미지를 빠르게 얻는 것입니다. 우리는 이미지를 얻기 위해 모든 점을 광선 추적 할 수 있지만 (블렌딩, 프리미티브 등과 같은 것을 이용하기를 원했기 때문에 OpenGL 또는 다른 투영 기술을 선호합니다.
첫번째 시도
I는 I는 3 × 찾는 문제 해결 판단 카메라 행렬 3 + 1 차원하게 균질 좌표 (왼쪽) -3- 공간 상하 2 공간에서 2 + 1 차원 동차 좌표에 프로젝트를로 (온 권리). 직접 선형 변환 을 사용하여 카메라 매트릭스 Ba=0
의 알 수없는 항목 a
에 대한 방정식 시스템을 얻고 단일 값 분해를 사용하여 시스템을 풀면이를 해결할 수 있습니다(SVD). EA, EB, EC, ED (여기서 E는 육안 또는 월드 공간의 카메라) 벡터를 사전 이미지의 포인트로, (0,0), (1,0), (1 , 1), (0,1) 또는 포스트 이미지의 점과 같은 점이 있으며 각 점 쌍은 SVD에 연결하는 몇 가지 선형 방정식을 제공합니다. 결과 행렬은 EA-> (0,0) 등을 매핑합니다. 충분한 자유도가 있다고 가정합니다. 즉, 솔루션이 독특하고 확실하지 않은 경우 참고 [a]를 참조하십시오.
그러나 내 chagrin에게 이것은 OpenGL이 작동하는 방식이 아닙니다. OpenGL은 3x4 매트릭스를 사용하여 3d에서 2d로 직접 투사하지 않습니다. OpenGL에는 3 차원 포인트 인 "정규화 된 장치 좌표"(NDC)가 필요합니다. NDC에 투영 한 후 (-1, -1, -1,1)에서 (1,1,1,1)까지 '단위'상자의 모든 항목이 그려집니다. 외부의 모든 것이 잘립니다 (동일한 좌표를 다루기 때문에 : (x, y, z, w)는 (x / w, y / w, z / w의 처음 세 좌표 인 경우에만 화면에 나타납니다) , 1)은 단위 상자 안에 -1에서 1)까지 있습니다.
그래서 문제는 다음과 같습니다. 이상하게 보이는 입방체를 동종 좌표로 매핑하는 합리적인 변환이 있습니까? (특히 ABCD (정면 점)와 A'B'C'D '(뒤 점, 숨겨진 점) 4x4 매트릭스를 사용하는 경우) 어떻게합니까?
내가 시도한 것
나는 더 강한 것을 시도했다 : 나는 ABCD와 A'B'C'D '를 일반적인 피라미드 절두체처럼 보이게 만들었다 (예 : gl frustrum). 4 변형이 아닌 DLT / 직선 선형 변환을 사용하여 주장 된 4x4 매트릭스를 해결했습니다. 그러나 그것을 시도했을 때 충분한 자유도가없는 것처럼 보였습니다 ... 결과 4x4 행렬은 모든 입력 벡터를 모든 출력 벡터에 매핑하지 않았습니다. A, B, C, D, A '(5 쌍의 사전 변환 및 사후 변환 벡터)를 사용하는 동안, 나는 / 거의 / 원하는 결과를 얻습니다 ... 벡터가 올바르게 매핑되지만, 예를 들어 B', C ', D'는 (-1, -1,1,1) 대신 (3,3,1,1)에 매핑되며 OpenGL에 의해 잘립니다. 여섯 번째 점 (4x4 행렬에 6 쌍의 점을 투영)을 추가하려고하면, 내 솔루션은 타락한 것처럼 보입니다 (0, 무한). 여기서 다루는 자유도는 얼마나되며, 우리가 알고 사랑하는 일반적인 4 벡터 (3 + 1 차원 동종 좌표 벡터)를 매핑하는 4x4 매트릭스로 가능합니까?
무작위 사소한 생각
4x4 행렬을 사용하여 임의의 입방체를 임의의 입방체에 매핑 할 수는 없다고 생각합니다 .2d에서 볼록 사변형을 다른 볼록 사변형에 매핑 할 수 있다고 생각했기 때문에 혼란 스럽습니다. 예를 들어 Photoshop? ... 이것은 투영 변환으로 수행 할 수 없는가? 그리고 어떻게 3D로 일반화합니까? ...... 또한 4x4 행렬을 찾지 못하면 선형 대수학에 따르면 NxN 행렬이 N 개의 선형 독립 점 이상을 N 개의 목표 지점에 매핑하는 것이 가장 좋은 경우가 아니라고 생각합니다. 숨겨진 공동 선성이 진행 중이기 때문에 좌표가이 속임수를 씁니까? 아닌 것 같아요?
다른 해결책?
나는 전형적인 추돌 점 카메라 프로젝션 매트릭스를 사용하고 모서리에 해당하는 2D 포인트를 찾은 다음 2D 원근 왜곡 왜곡 호모 그래피를 수행하지만 픽셀이 렌더링 된 후에 발생할 수있는 추한 일을 할 수도 있습니다. (예 : 포토샵) 그렇다면 해상도에 문제가있을 것입니다 ... 어쩌면 NDC 공간 내에서 XY 평면 에서이 변환을 수행하는 행렬을 알아 낸 다음 정상적인 절두체 기반 행렬로 구성 할 수 있습니까?
(참고 [a] : 자유도 : ABCD는 필요한 경우 직사각형에 작용하는 투영 변환의 사후 이미지로 제한 될 수 있습니다. 필요한 경우 왼쪽의 검은 색 직사각형이라고 할 수 있습니다. 사진 프레임 클립 아트 모델을 투영 한 결과)