나는 원근 카메라로 작업 중이다. 생성자는 다음과 같아야합니다.투시도 주어진 시야 만 투영
PerspectiveCamera::PerspectiveCamera(Vec3f ¢er, Vec3f &direction, Vec3f &up, float angle)
이것은 거의 클리핑 평면이 아니므로 멀리있는 클리핑 평면이 없으므로 대부분의 다른 구성과 다릅니다. 나는 중심, 방향, 그리고 위로 - 알고리즘에 대한 표준적인 견해를 가지고 무엇을 알아야한다. 이에 따라
우리는 뷰 행렬을 구성하고 번역 할 수 있습니다 매트릭스 :
따라서 뷰잉 변환은 다음의 역변환이 스크린 공간에서 월드 스페이스로 이동하는 데 사용된다
(ME 올바르게 작동) 직교 카메라. 카메라 좌표는 화면 공간에서 (-1, -1,0) -> (1,1,0)로 이동합니다.
는 투시 변환의 경우, 볼의 필드를 설명한다. Wikipedia 3D projection article는 시야각을 사용하여 원근 투영 매트릭스를 제공하고 카메라를 가정하기로 이동 좌표 (-1, -1) -> (1,1) :
에서 내 코드, (ex, ey, ez)는 (-1, -1, ez) -> (1,1, ez)에서 오는 카메라 좌표입니다. K의 1 (3,3) 자리는 Wikipedia 기사에 없습니다. 행렬을 역행렬로 만들기 위해 넣었습니다. 그래서 이것이 문제가 될 수 있습니다.
하지만 어쨌든, 투시 투영을 위해,이 변형에 사용 :
K 역은 절두체의 표준 뷰 볼륨을 만드는 P로 승산하여, 그 결과를 승산된다 M inverse를 사용하여 월드 좌표로 이동합니다.
잘못된 결과가 표시됩니다. 올바른 출력은 다음과 같습니다
내 출력은 다음과 같습니다
내가 내 제약 (NO 근거리 및 원거리 평면 입력) 주어진 원근 투영에 적합한 알고리즘을 사용하고 있습니까? ??
당신의 설명에서 철근 및 원근 클립면이 서로 동일합니까 (ez)? 투시 투영 행렬에 대한 기존 방정식을 사용하면 ** m22 ** 및 ** m23 ** (여기서 인덱스는 ** 0 **으로 시작합니다)은 무한합니다. –
"(-1, -1, ez) -> (1,1, ez)라고 말했을 때를 가정합니다." 아니요, 저는 가까운 쪽과 먼 쪽의 클립면을 의미한다고 생각하지 않습니다. 위키피디아에 따르면, 디스플레이 표면에 대한 뷰어의 위치를 제외 시키십시오. –
내가 생각한 방식은 (-1, -1) -> (1,1)에서 오는 알파와 xy 좌표의 시야를 가지고 있다고 가정하면 ez는 z 축으로부터 z 축입니다. 하지만 그건 내 추측입니다. –