|
参照planeExtraction.pdf。Directx的实现如下:
D3DXMATRIX WorldMatrix;
D3DXMATRIX ViewMatrix;
D3DXMATRIX ProjectMatrix;
pD3DDevice->GetTransform( D3DTS_WORLD, &WorldMatrix );
pD3DDevice->GetTransform( D3DTS_VIEW, &ViewMatrix );
pD3DDevice->GetTransform( D3DTS_PROJECTION, & rojectMatrix );
D3DXMATRIX ComboMatrix;
D3DXMatrixMultiply(&ComboMatrix, &WorldMatrix, &ViewMatrix);
D3DXMatrixMultiply(&ComboMatrix, &ComboMatrix, &ProjectMatrix);
//D3DXMatrixMultiply(&ComboMatrix, &ViewMatrix, &ProjectMatrix);
// right clipping plane
frustum[0][0] = ComboMatrix._14 - ComboMatrix._11;
frustum[0][1] = ComboMatrix._24 - ComboMatrix._21;
frustum[0][2] = ComboMatrix._34 - ComboMatrix._31;
frustum[0][3] = ComboMatrix._44 - ComboMatrix._41;
NormalizePlane(frustum, 0);
// left clipping plane
frustum[1][0] = ComboMatrix._14 + ComboMatrix._11;
frustum[1][1] = ComboMatrix._24 + ComboMatrix._21;
frustum[1][2] = ComboMatrix._34 + ComboMatrix._31;
frustum[1][3] = ComboMatrix._44 + ComboMatrix._41;
NormalizePlane(frustum, 1);
// bottom clipping plane
frustum[2][0] = ComboMatrix._14 + ComboMatrix._12;
frustum[2][1] = ComboMatrix._24 + ComboMatrix._22;
frustum[2][2] = ComboMatrix._34 + ComboMatrix._32;
frustum[2][3] = ComboMatrix._44 + ComboMatrix._42;
NormalizePlane(frustum, 2);
// top clipping plane
frustum[3][0] = ComboMatrix._14 - ComboMatrix._12;
frustum[3][1] = ComboMatrix._24 - ComboMatrix._22;
frustum[3][2] = ComboMatrix._34 - ComboMatrix._32;
frustum[3][3] = ComboMatrix._44 - ComboMatrix._42;
NormalizePlane(frustum, 3);
// near clipping plane
frustum[4][0] = ComboMatrix._13;
frustum[4][1] = ComboMatrix._23;
frustum[4][2] = ComboMatrix._33;
frustum[4][3] = ComboMatrix._43;
NormalizePlane(frustum, 4);
// far clipping plane
frustum[5][0] = ComboMatrix._14 - ComboMatrix._13;
frustum[5][1] = ComboMatrix._24 - ComboMatrix._23;
frustum[5][2] = ComboMatrix._34 - ComboMatrix._33;
frustum[5][3] = ComboMatrix._44 - ComboMatrix._43;
NormalizePlane(frustum, 5);
但我看网上很多人,包括一些网站里面写的d3d程序中 near clipping plane 是
frustum[4][0] = ComboMatrix._14 + ComboMatrix._13;
frustum[4][1] = ComboMatrix._24 + ComboMatrix._23;
frustum[4][2] = ComboMatrix._34 + ComboMatrix._33;
frustum[4][3] = ComboMatrix._44 + ComboMatrix._43;
而参照planeExtraction.pdf中讲述的,opengl的实现方式才是如此,direct3d里面应该是
frustum[4][0] = ComboMatrix._13;
frustum[4][1] = ComboMatrix._23;
frustum[4][2] = ComboMatrix._33;
frustum[4][3] = ComboMatrix._43;
我很迷惑,到底哪个是正确的? |
|