|
|
发表于 2003-10-19 23:46:00
|
显示全部楼层
Re: 能解释一下SDK中那个投影映射是怎么完成的吗?
要取得视锥的六个平面方程并不难.
给你我写的源码看看就知道了.
void CFrustum::CalculateFrustum(LPDIRECT3DDEVICE8 pD3DDevice)
{
D3DXMATRIX mWorldMat;
pD3DDevice->GetTransform( D3DTS_WORLD, &mWorldMat );
D3DXMATRIX mProjectMat;
pD3DDevice->GetTransform( D3DTS_PROJECTION, &mProjectMat );
D3DXMATRIX mViewMat;
pD3DDevice->GetTransform( D3DTS_VIEW, &mViewMat );
D3DXMatrixMultiply( &mWorldMat, &mViewMat,&mWorldMat);
//D3DXMatrixMultiply( &mWorldMat,&mWorldMat, &mViewMat);
D3DXMATRIX mClipMat;
D3DXMatrixMultiply( &mClipMat, &mWorldMat, &mProjectMat);
m_Frustum[RIGHT][A] = mClipMat._14 - mClipMat._11;
m_Frustum[RIGHT][B] = mClipMat._24 - mClipMat._21;
m_Frustum[RIGHT][C] = mClipMat._34 - mClipMat._31;
m_Frustum[RIGHT][D] = mClipMat._44 - mClipMat._41;
NormalizePlane(m_Frustum,RIGHT);
m_Frustum[LEFT][A] = mClipMat._14 + mClipMat._11;
m_Frustum[LEFT][B] = mClipMat._24 + mClipMat._21;
m_Frustum[LEFT][C] = mClipMat._34 + mClipMat._31;
m_Frustum[LEFT][D] = mClipMat._44 + mClipMat._41;
NormalizePlane(m_Frustum,LEFT);
m_Frustum[BOTTOM][A] = mClipMat._14 + mClipMat._12;
m_Frustum[BOTTOM][B] = mClipMat._24 + mClipMat._22;
m_Frustum[BOTTOM][C] = mClipMat._34 + mClipMat._32;
m_Frustum[BOTTOM][D] = mClipMat._44 + mClipMat._42;
NormalizePlane(m_Frustum,BOTTOM);
m_Frustum[TOP][A] = mClipMat._14 - mClipMat._12;
m_Frustum[TOP][B] = mClipMat._24 - mClipMat._22;
m_Frustum[TOP][C] = mClipMat._34 - mClipMat._32;
m_Frustum[TOP][D] = mClipMat._44 - mClipMat._42;
NormalizePlane(m_Frustum,TOP);
m_Frustum[BACK][A] = mClipMat._14 - mClipMat._13;
m_Frustum[BACK][B] = mClipMat._24 - mClipMat._23;
m_Frustum[BACK][C] = mClipMat._34 - mClipMat._33;
m_Frustum[BACK][D] = mClipMat._44 - mClipMat._43;
NormalizePlane(m_Frustum,BACK);
m_Frustum[FRONT][A] = mClipMat._14 + mClipMat._13;
m_Frustum[FRONT][B] = mClipMat._24 + mClipMat._23;
m_Frustum[FRONT][C] = mClipMat._34 + mClipMat._33;
m_Frustum[FRONT][D] = mClipMat._44 + mClipMat._43;
NormalizePlane(m_Frustum,FRONT);
}
|
|