지형에 관한 서적을 보며 공부하고 있는 뉴비입니다.
이 책에서 임의의 카메라 행렬로부터 3D 평면 추출하기라고 하여..
절두체의 각 클리핑 면을 구하고 이용하는 함수가 나와있는데..
왜 이런식으로 구해야하는지 잘 모르겠습니다. ㅠㅠ
가령 왜 왼쪽 클리핑면을 구하는데 matrix._14 + matrix._11을 구하는지요..ㅠ
행렬의 회전, 이동 등을 봐도 잘 이해가 안됩니다.
고수님들의 조언 부탁드려요~~
inline void cFrustum::extractFromMatrix(
const cMatrix4x4& matrix,
bool normalizePlanes)
{
// 왼쪽 클리핑면
leftPlane.normal.x = matrix._14 + matrix._11;
leftPlane.normal.y = matrix._24 + matrix._21;
leftPlane.normal.z = matrix._34 + matrix._31;
leftPlane.distance = matrix._44 + matrix._41;
// 오른쪽 클리핑면
rightPlane.normal.x = matrix._14 - matrix._11;
rightPlane.normal.y = matrix._24 - matrix._21;
rightPlane.normal.z = matrix._34 - matrix._31;
rightPlane.distance = matrix._44 - matrix._41;
// 위쪽 클리핑면
topPlane.normal.x = matrix._14 - matrix._12;
topPlane.normal.y = matrix._24 - matrix._22;
topPlane.normal.z = matrix._34 - matrix._32;
topPlane.distance = matrix._44 - matrix._42;
// 아래쪽 클리핑면
bottomPlane.normal.x = matrix._14 + matrix._12;
bottomPlane.normal.y = matrix._24 + matrix._22;
bottomPlane.normal.z = matrix._34 + matrix._32;
bottomPlane.distance = matrix._44 + matrix._42;
// 근거리 클리핑면
nearPlane.normal.x = matrix._13;
nearPlane.normal.y = matrix._23;
nearPlane.normal.z = matrix._33;
nearPlane.distance = matrix._43;
// 원거리 클리핑면
farPlane.normal.x = matrix._14 - matrix._13;
farPlane.normal.y = matrix._24 - matrix._23;
farPlane.normal.z = matrix._34 - matrix._33;
farPlane.distance = matrix._44 - matrix._43;
if(normalizePlanes)
{
leftPlane.normalize();
rightPlane.normalize();
topPlane.normalize();
bottomPlane.normalize();
nearPlane.normalize();
farPlane.normalize();
}
}
절두체 구하기에 대해 질문 드려요~
Moderator: 류광