|
|
发表于 2009-5-27 21:43:00
|
显示全部楼层
Re:OBB的创建算法
以下是我代码里面的一部分,也许对你有用
//得到原Aabb随被包围体变换之后成为Obb的8个顶点和6个面
D3DXVECTOR3 * BaseAABB::GetObbPoints()
{
Entity * entity = GetOwner();
D3DXMATRIX * mat = entity->GetSenceWorldMatrix();
/*
原AAbb八个顶点
3—2 7—6
|底| + |顶|
0—1 4—5
随被包围对象变换之后的坐标
*/
if(mat)
{
if(lastMat != *mat)
{
//更新Obb的8个顶点
mObbPoints[0].x = m_vMin.x; mObbPoints[0].y = m_vMin.y; mObbPoints[0].z = m_vMin.z;
mObbPoints[1].x = m_vMax.x; mObbPoints[1].y = m_vMin.y; mObbPoints[1].z = m_vMin.z;
mObbPoints[2].x = m_vMax.x; mObbPoints[2].y = m_vMin.y; mObbPoints[2].z = m_vMax.z;
mObbPoints[3].x = m_vMin.x; mObbPoints[3].y = m_vMin.y; mObbPoints[3].z = m_vMax.z;
mObbPoints[4].x = m_vMin.x; mObbPoints[4].y = m_vMax.y; mObbPoints[4].z = m_vMin.z;
mObbPoints[5].x = m_vMax.x; mObbPoints[5].y = m_vMax.y; mObbPoints[5].z = m_vMin.z;
mObbPoints[6].x = m_vMax.x; mObbPoints[6].y = m_vMax.y; mObbPoints[6].z = m_vMax.z;
mObbPoints[7].x = m_vMin.x; mObbPoints[7].y = m_vMax.y; mObbPoints[7].z = m_vMax.z;
D3DXVec3TransformCoordArray(mObbPoints, sizeof(D3DXVECTOR3), mObbPoints, sizeof(D3DXVECTOR3),mat, 8);
//更新Obb的6个平面
D3DXPlaneFromPoints(&mObbPlanes[0], mObbPoints + 4, mObbPoints + 7, mObbPoints + 6); // 上平面(top)
D3DXPlaneFromPoints(&mObbPlanes[1], mObbPoints , mObbPoints + 1, mObbPoints + 2); // 下平面(bottom)
D3DXPlaneFromPoints(&mObbPlanes[2], mObbPoints , mObbPoints + 4, mObbPoints + 5); // 近平面(near)
D3DXPlaneFromPoints(&mObbPlanes[3], mObbPoints + 2, mObbPoints + 6, mObbPoints + 7); // 远平面(far)
D3DXPlaneFromPoints(&mObbPlanes[4], mObbPoints , mObbPoints + 3, mObbPoints + 7); // 左平面(left)
D3DXPlaneFromPoints(&mObbPlanes[5], mObbPoints + 1, mObbPoints + 5, mObbPoints + 6); // 右平面(right)
lastMat = *mat;
}
return mObbPoints;
}
else
{
return 0;
}
} |
|