|
|
发表于 2007-1-22 15:26:00
|
显示全部楼层
Re:原始的包围盒变换距阵后如何得到变换后的4个顶点
楼主指的是AABB盒子吧
只变换八个点是很不准确的…
看看《3D游戏开发中的数学》中的算法吧
下面的代码是从书里整理出来的,我测试过,基本能用 .
struct AABB
{
D3DXVECTOR3 _min ;
D3DXVECTOR3 _max ;
void TransformBox(const D3DXMATRIX& mat) ;
};
inline void AABB::TransformBox(const D3DXMATRIX& mat)
{
AABBbox(_min ,_max) ;
_min = _max = D3DXVECTOR3(mat.m[3][0],mat.m[3][1],mat.m[3][2]);
if (mat.m[0][0] > 0.0f)
{
_min.x += mat.m[0][0] * box._min.x; _max.x += mat.m[0][0] * box._max.x;
}
else
{
_min.x += mat.m[0][0] * box._max.x; _max.x += mat.m[0][0] * box._min.x;
}
if (mat.m[0][1] > 0.0f)
{
_min.y += mat.m[0][1] * box._min.x; _max.y += mat.m[0][1] * box._max.x;
}
else
{
_min.y += mat.m[0][1] * box._max.x; _max.y += mat.m[0][1] * box._min.x;
}
if (mat.m[0][2] > 0.0f)
{
_min.z += mat.m[0][2] * box._min.x; _max.z += mat.m[0][2] * box._max.x;
}
else
{
_min.z += mat.m[0][2] * box._max.x; _max.z += mat.m[0][2] * box._min.x;
}
if (mat.m[1][0] > 0.0f)
{
_min.x += mat.m[1][0] * box._min.y; _max.x += mat.m[1][0] * box._max.y;
}
else
{
_min.x += mat.m[1][0] * box._max.y; _max.x += mat.m[1][0] * box._min.y;
}
if (mat.m[1][1] > 0.0f)
{
_min.y += mat.m[1][1] * box._min.y; _max.y += mat.m[1][1] * box._max.y;
}
else
{
_min.y += mat.m[1][1] * box._max.y; _max.y += mat.m[1][1] * box._min.y;
}
if (mat.m[1][2] > 0.0f)
{
_min.z += mat.m[1][2] * box._min.y; _max.z += mat.m[1][2] * box._max.y;
}
else
{
_min.z += mat.m[1][2] * box._max.y; _max.z += mat.m[1][2] * box._min.y;
}
if (mat.m[2][0] > 0.0f)
{
_min.x += mat.m[2][0] * box._min.z; _max.x += mat.m[2][0] * box._max.z;
}
else
{
_min.x += mat.m[2][0] * box._max.z; _max.x += mat.m[2][0] * box._min.z;
}
if (mat.m[2][1] > 0.0f)
{
_min.y += mat.m[2][1] * box._min.z; _max.y += mat.m[2][1] * box._max.z;
}
else
{
_min.y += mat.m[2][1] * box._max.z; _max.y += mat.m[2][1] * box._min.z;
}
if (mat.m[2][2] > 0.0f)
{
_min.z += mat.m[2][2] * box._min.z; _max.z += mat.m[2][2] * box._max.z;
}
else
{
_min.z += mat.m[2][2] * box._max.z; _max.z += mat.m[2][2] * box._min.z;
}
} |
|