2009년 04월 10일
[3D] 카메라 범위외의 Z버퍼값 - 결과분석
이전글에서 카메라의 범위에 벗어난 좌표들의 Z버퍼값은 무조건
1이상의 값을 가진다고 했습니다. 이 이유에 대해 알아보았습니다.
우선 투영행열의 행열공식은 다음과 같습니다.
2*zn/w 0 0 0
0 2*zn/h 0 0
0 0 zf/(zf-zn) 1
0 0 zn*zf/(zn-zf) 0
여기서 34, 34부분이 Z값을 계산하는 부분이죠. (31, 32는 0이니 의미가 없음)
이것만 봤을땐 Z값은 -값을 가지게 됩니다.
문제는 43의 1의 존재입니다. 여기서 w값에 Z값.
즉, 투영전의 Z값을 저장하게 되는것입니다.
3D의 행열연산에서 3차원벡터는 w가 1을 가진 4차원벡터로 변환되서 계산됩니다.
그리고 벡터와 행열을 연산시켜주는 함수의 형식을 보면 아래와 같습니다.
D3DXVECTOR3 * D3DXVec3TransformCoord(
D3DXVECTOR3 *pOut,
CONST D3DXVECTOR3 *pV,
CONST D3DXMATRIX *pM
);
즉 3차원벡터를 반환하게 되지요. 행열과의 곱에선 벡터를 4차원으로 승격시키고
결과로 4차원을 가지게 되었습니다. 그러므로 3차원 벡터를 반환해야 하는
D3DXVec3TransformCoord를 내부에선 4차원을 3차원으로 강등시켜야 하죠.
이를 위해선 처음에 w에 1을 줬듯이(자동으로 입력되지만)
행열연산의 결과의 w를 1로 만들어줘야 하고, 각 x,y,z를 w로 나누게 됩니다.
이것은 MSDN에 결과는 w를 1이 되도록 반환한다라고 나와있기도 합니다.
그러므로 음수값을 가졌던 z값에 음수값을 가진 w값을 나누니 음수가 나올수 없는거지요.
눈으로 보고 싶으면 D3DXVec4Transform을 사용해보면 됩니다.
예를 들어 카메라 변환을 마친 4차원벡터 (0, 0, -200, 1)이 있다고 합시다.
카메라 변환을 마친후이므로 Z값이 -200이라는 건 카메라 뒤에 있다는 뜻이죠(왼손좌표계)
이걸 위의 행열과 곱해주면 다음과 같습니다.
0.0 0.0 -203.0302 -200.00
그리고 w를 1로 만들어주기위해 각 성분을 w로 나누면 결국 z값은 1.01515가 되지요..
이것은 3차원 벡터 (0, 0, -200)과 위 행열의 연산으로 구해지는 z값과 일치하게 됩니다.
1이상의 값을 가진다고 했습니다. 이 이유에 대해 알아보았습니다.
우선 투영행열의 행열공식은 다음과 같습니다.
2*zn/w 0 0 0
0 2*zn/h 0 0
0 0 zf/(zf-zn) 1
0 0 zn*zf/(zn-zf) 0
여기서 34, 34부분이 Z값을 계산하는 부분이죠. (31, 32는 0이니 의미가 없음)
이것만 봤을땐 Z값은 -값을 가지게 됩니다.
문제는 43의 1의 존재입니다. 여기서 w값에 Z값.
즉, 투영전의 Z값을 저장하게 되는것입니다.
3D의 행열연산에서 3차원벡터는 w가 1을 가진 4차원벡터로 변환되서 계산됩니다.
그리고 벡터와 행열을 연산시켜주는 함수의 형식을 보면 아래와 같습니다.
D3DXVECTOR3 * D3DXVec3TransformCoord(
D3DXVECTOR3 *pOut,
CONST D3DXVECTOR3 *pV,
CONST D3DXMATRIX *pM
);
즉 3차원벡터를 반환하게 되지요. 행열과의 곱에선 벡터를 4차원으로 승격시키고
결과로 4차원을 가지게 되었습니다. 그러므로 3차원 벡터를 반환해야 하는
D3DXVec3TransformCoord를 내부에선 4차원을 3차원으로 강등시켜야 하죠.
이를 위해선 처음에 w에 1을 줬듯이(자동으로 입력되지만)
행열연산의 결과의 w를 1로 만들어줘야 하고, 각 x,y,z를 w로 나누게 됩니다.
이것은 MSDN에 결과는 w를 1이 되도록 반환한다라고 나와있기도 합니다.
그러므로 음수값을 가졌던 z값에 음수값을 가진 w값을 나누니 음수가 나올수 없는거지요.
눈으로 보고 싶으면 D3DXVec4Transform을 사용해보면 됩니다.
예를 들어 카메라 변환을 마친 4차원벡터 (0, 0, -200, 1)이 있다고 합시다.
카메라 변환을 마친후이므로 Z값이 -200이라는 건 카메라 뒤에 있다는 뜻이죠(왼손좌표계)
이걸 위의 행열과 곱해주면 다음과 같습니다.
0.0 0.0 -203.0302 -200.00
그리고 w를 1로 만들어주기위해 각 성분을 w로 나누면 결국 z값은 1.01515가 되지요..
이것은 3차원 벡터 (0, 0, -200)과 위 행열의 연산으로 구해지는 z값과 일치하게 됩니다.
# by | 2009/04/10 23:51 | Programming | 트랙백 | 덧글(0)




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]