2013-04-21 5 views
1

저는 작업중인 카메라 클래스의 절두체 코너를 계산하는 방법을 쓰려고합니다. I MVP 행렬이 내 버텍스 쉐이더에 푸시 되었기 때문에 실제로 모든 것이 화면에서 정확하지만이 행렬에서 worldspace frustum 평면을 계산하므로 정확합니다. 또한 이러한 방법은 몇 가지 다른 카메라 구성에서 단위 테스트를 거쳐 예상되는 결과를 제공합니다.예상치 못한 절두체 코너보기

MVC 행렬의 역함수로 NDC 모서리를 변환하여 절두체 모서리를 계산하려고합니다.

// Fill with the corners in clip space. 
QVector<Vector3f> corners(8); 
corners[0] << 1.0f, 1.0f, 1.0f; 
corners[1] << -1.0f, 1.0f, 1.0f; 
corners[2] << 1.0f, -1.0f, 1.0f; 
corners[3] << -1.0f, -1.0f, 1.0f; 
corners[4] << 1.0f, 1.0f, -1.0f; 
corners[5] << -1.0f, 1.0f, -1.0f; 
corners[6] << 1.0f, -1.0f, -1.0f; 
corners[7] << -1.0f, -1.0f, -1.0f; 

// Then transform back into worldspace. 
for (Vector3f& c : corners) { 
    c = mult(mvp.inverse(), c); 
} 

충분히 존경 같은데,하지만 난 내 MVP (열 전공)에 넣어 경우 : 35.0 °에서이 훨씬 500.0에서 0.8에서 근처 클립 카메라입니다

-1.68199 0.0  1.68199 0.0 
-0.720796 3.00332 -0.720796 0.0 
-0.671735 -0.322433 -0.671735 35.8534 
-0.669589 -0.321403 -0.669589 37.3363 

, FOV, 뷰포트 크기가 800x600이고 원점 (y이 위쪽 축임)을 보면서 [25.0, 12.0, 25.0]에 배치됩니다. 나는이 코너를 얻을 :

-0.988515, 0.00116634, -0.393982 
-0.393982, 0.00116634, -0.988515 
-0.845201, -0.595974, -0.250669 
-0.250669, -0.595974, -0.845201 

30.2115, 14.9772, 30.8061 
30.8061, 14.9772, 30.2115 
30.3548, 14.38, 30.9494 
30.9494, 14.38, 30.3548 

(당신은 미친 갈거야) 너무 오래 숫자에 응시하지 마십시오, 당신은 기대할 것이 무엇 인 서로 단위의 어떤 구석 수백이 없는지주의 500.0의 먼 평면. 이 절차에 대해 이해하지 못하는 점은 무엇입니까?

많이, 난 그냥 추측하게 당신의 숫자를 보지 않고

답변

2

: 나는를 추가하여 (당신이 4D 동차 좌표로 확장 한 후 자신의 4 번째 구성 요소로 변환 한 모서리를 분할하는 것을 잊지 않았다 희망

1)를 역 MVP로 다중 닝합니다.

MVP 행렬 (실제로 투영 부분)과 그 역함수는 어파 인 변환이 아니므로 동질성 벡터에 적용하면 1이 아닌 w 값이되므로 필요합니다. 이는 벡터를 변형 할 때 일반 MVP 곱셈을 적용 할 때와 동일합니다. 즉, 고정 함수 그래픽 하드웨어가이 부분을 w으로 (즉, 투영 영역이라고합니다.) 실제로이 거리가 멀리 떨어져 있기 때문에 동일합니다 화면의 오브젝트가 작아짐).

+0

"변형 된 모서리를 나누는 것을 잊지 않았 으면 좋겠다 ..."Doh! 나는 내가 집에 돌아올 때까지 기다려야 할 것이다. 그러나 그것은 틀린 것과 똑같이 들린다. +1 – cmannett85