2012-03-10 3 views
1

마우스 클릭을 기반으로하는 3D 벡터를 계산할 때 사용하는 수학은 효과가 있지만 사실 작동한다는 사실은 나를 괴롭 히고 있습니다. 가로 축에 대한 시야를 기반으로 새로운 비율을 계산하는 대신 가로 축의 종횡비로 세로 축에 표현 된 뷰 - 가로 세로 축의 시야를 기반으로 새 비율을 계산하는 대신이 필드가 선형으로 스케일링되는 반면 수평축에 대한 fov 탄젠트를 다시 계산하면 이 아니므로 내 카메라에 약간 거친 렌즈가있어 궁금합니다.. 여기 D3D의 화면 좌표에서 3D 벡터 투영이 반 직관적 인 것 같습니다

합니다 (FOV가 수평 축에 표현되어 있습니다 및 D3D는 수직축을 원하는) 잘 작동 코드,의

double mouseX = ((((double) hitPt.x)/(double) vport.cx) - 0.5) * 2.0; 
double mouseY = ((1.0 - (((double) hitPt.y)/(double) vport.cy)) - 0.5) * 2.0; 
double tfy = tan((fov/aspr) * 0.5); 


double tfx = tfy * aspr; 

SFMatrix4 CM1; 
this->m_renderSurface->GetRawCameraMatrix(CM1); 
CM1.Invert(); 
origin = CM1 * SFVec3f((nearp * tfx) * mouseX,(nearp * tfy) * mouseY,nearp); 
dest = CM1 * SFVec3f((farp * tfx) * mouseX,(farp * tfy) * mouseY,farp); 

내 감성 의 기분을 상하게하는 라인을 격리했습니다 (tfx = tfy * aspr) - 차라리 할 것입니다. tfx = tan (fov) * 0.5; 하지만 작동하지 않습니다. 센터에서 멀리 떨어지면서 오류가 증가합니다. 이것이 D3D가하는 일이며 나는 단지 그걸로 살아야 할 것입니다. 저는 호기심을 가지고 있습니다. 대략 어떤 경로가 실제로 옳은가요? (이산 메쉬를 통해 선형 대수를 밀어 붙이려는 시도가 옳은만큼) 이유는 무엇입니까?

답변

1

저는 이것이 처음에는 직관이 아닌 투영의 한 측면이라는 데 동의합니다.

눈의 시야가 본질적으로 구형에 투영됩니다. 결과적으로 특정 각도의 범위를 지정하는 오브젝트는 직선으로 보거나 주변 시야에서 보는 것과 상관없이 동일한 크기를 갖는 것처럼 보입니다. 물체의 두 가장자리 사이의 각도 차이는 크기를 정의하는 것이므로 객체에 대한 각도는 시야에서 물체의 위치를 ​​정의하는 좋은 방법입니다.

평평한 표면에 투영 할 때 규칙이 약간 다릅니다. 이 사진에서 보면 :

enter image description here

객체의 각도에 의해 결정되지 않고 화면상의 각 오브젝트의 위치. 대신, 우리는 비슷한 삼각형 사용

(distance from center of screen)  (offset from sight line to object) 
________________________________ = ___________________________________________ 
(distance from eye to screen)  (distance along sight line to object plane) 
+0

아하를 - 머리가 아파요 - 가상 카메라가 (제대로) 원형/구면 렌즈를 가지고 있다고 가정하고, 나는 투사의 선형 특성을 뒤죽박죽 한 - 나는 빠른했다 렌즈 자체를 비대칭으로 만드는 자체 프로젝션 기능으로 테스트 해보니 결과는 막연하게 불안정했습니다. –

관련 문제