|
|

楼主 |
发表于 2008-5-19 10:48:00
|
显示全部楼层
Re:关于定义平截头体剔除场景中一渲染顶点的问题。敬请
回过头来看了一看这个问题,再看看你们的提示,已经搞明白了,含泪多谢各位的提示。
创建六个面的过程如下:
1.定义一个(-1,-1,0) ~ (1,1,1)之间的裁剪空间立方体,顶点坐标信息如下:
m_vtx[0].x = -1.0f; m_vtx[0].y = -1.0f; m_vtx[0].z = 0.0f;
m_vtx[1].x = 1.0f; m_vtx[1].y = -1.0f; m_vtx[1].z = 0.0f;
m_vtx[2].x = 1.0f; m_vtx[2].y = -1.0f; m_vtx[2].z = 1.0f;
m_vtx[3].x = -1.0f; m_vtx[3].y = -1.0f; m_vtx[3].z = 1.0f;
m_vtx[4].x = -1.0f; m_vtx[4].y = 1.0f; m_vtx[4].z = 0.0f;
m_vtx[5].x = 1.0f; m_vtx[5].y = 1.0f; m_vtx[5].z = 0.0f;
m_vtx[6].x = 1.0f; m_vtx[6].y = 1.0f; m_vtx[6].z = 1.0f;
m_vtx[7].x = -1.0f; m_vtx[7].y = 1.0f; m_vtx[7].z = 1.0f;
2.将(-1,-1,0) ~ (1,1,1)之间的裁剪空间立方体顶点转换成世界坐标。代码如下
// 求得view * proj的逆矩阵.
D3DXMatrixInverse(&matInv, NULL, pmatViewProj );
//坐标转换
for( i = 0; i < 8; i++ )
D3DXVec3TransformCoord( &m_vtx, &m_vtx, &matInv );
3.求出基于世界坐标系的裁剪平面:
D3DXPlaneFromPoints(&m_plane[0], m_vtx+4, m_vtx+7, m_vtx+6); // 上平面(top)
D3DXPlaneFromPoints(&m_plane[1], m_vtx , m_vtx+1, m_vtx+2); // 下平面(bottom)
D3DXPlaneFromPoints(&m_plane[2], m_vtx , m_vtx+4, m_vtx+5); // 近平面(near)
D3DXPlaneFromPoints(&m_plane[3], m_vtx+2, m_vtx+6, m_vtx+7); // 远平面(far)
D3DXPlaneFromPoints(&m_plane[4], m_vtx , m_vtx+3, m_vtx+7); // 左平面(left)
D3DXPlaneFromPoints(&m_plane[5], m_vtx+1, m_vtx+5, m_vtx+6); // 右平面(right)
我提问时提到的《3D游戏编程》一书中创建裁减面的过程大概如上。
至于敢问2007提出的方法,我继续研究一下。 |
|