2014-03-12 1 views
0

이 관계를 파악하려고 노력했지만 어쩔 수 없지만 어쩌면 올바른 것을 검색하지 못하고 있습니다. Vector3.Project를 사용하여 클립 공간에 월드 공간 좌표를 투영하면 X와 Y 좌표는 의미가 있지만 Z (0..1) 좌표를 계산하는 방법을 알 수는 없습니다. 예를 들어, 내 근거리가 1이고 원거리가 1000 인 경우, 내가 얻은 화면 공간에 (0,0,500) (카메라 센터, 원거리 평면까지의 거리의 50 %)의 Vector3을 투영합니다 (1050, 500, .9994785)Direct3D의 투영 된 Z 값과 예상되지 않은 Z 값의 관계

결과 X 및 Y 좌표는 완벽한 의미를 갖지만 결과 Z 값을 얻는 위치를 이해하지 못합니다.

실제로 스크린 공간 좌표를 제거하려하고 있기 때문에 Z- 값을 선택하여 카메라와의 거리를 지정해야만 월드 - 공간 좌표를 원할 수 있기 때문에 필요합니다. 클립 공간 Z (0-1)와 월드 - 공간 Z (nearplane-farplane) 사이의 관계를 이해하지 못합니다. 이 도움이 경우

내 변환 행렬은 다음

World = Matrix.Identity; 

//basically centered at 0,0,0 looking into the screen 
View = Matrix.LookAtLH(
    new Vector3(0,0,0), //camera position 
    new Vector3(0,0,1), //look target 
    new Vector3(0,1,0)); //up vector 

Projection = Matrix.PerspectiveFovLH(
    (float)(Math.PI/4), //FieldOfViewY 
    1.6f, // AspectRatio 
    1, //NearPlane 
    1000); //FarPlane 

답변

1

표준 투시 투영 장면 깊이와 깊이 버퍼의 값이 아닌 선형 하나 사이의 상호 관계를 생성한다. 이로 인해 일반적으로 원하는 원거리 평면에 가까운 것보다 근거리 평면에 가까운 객체에 버퍼 정밀도의 높은 비율이 적용됩니다. 실제 연산에 관해서는, 여기서 파괴 같습니다

우하 × 2 요소는 투영 매트릭스 (Z 및 w에 대응)이다 :

[far/(far - near)  ] [1] 
[-far * near/(far - near)] [0] 

이것은 즉, z' = z * far/(far - near) - far * near/(far - near)w' = z 승산 후의. 이 단계가 끝나면 원근감 나누기 z'' = z'/w'이 있습니다. 특정 경우

는 수학 당신이있어 값으로 운동한다 :

z = 500 
z' = z * 1000/(1000 - 999) - 1000/(1000 - 999) = 499.499499499... 
w' = z = 500 
z'' = z'/w' = 0.998998998... 

원래의 깊이를 복구하려면 작업을 역 :

z = (far/(far - near))/((far/(far - near)) - z'') 
+0

당신을 감사합니다! 나는 결국 해킹을 위해 정착했으나, 이것이 내가 올바르게 할 수있게 해줄 것이다. – HypnoToad