dirextx 如何计算mesh旋转后的包围盒的坐标

hh23 2009-04-02 09:28:40
通过ComputeBoundingBox能够得到初始状态的min,max向量。但当z轴选择a度后min,max如何计算?
...全文
136 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgramRookie 2009-04-28
  • 打赏
  • 举报
回复
直接用变换阵乘包围盒是绝对错误的,自己画下就知道变换后模型很可能会不在包围盒内,应该先变换所得到的包围盒八个顶点,再从这8个顶点中计算出一个新的包围盒:
实例:
void SelfDefObj::CalculateBoundingBoxInWorld(){

D3DXVECTOR3 tmpMin, tmpMax;
D3DXVECTOR3 modelMin, modelMax;
this->m_worldAABB.GetDetails( tmpMax, tmpMin );
this->m_modelAABB.GetDetails( modelMax, modelMin );

//先获取平移量
tmpMin = tmpMax = D3DXVECTOR3( this->m_pMotelToWorld->_41, this->m_pMotelToWorld->_42, this->m_pMotelToWorld->_43 );

//再获取旋转缩放的变化
if( this->m_pMotelToWorld->_11 > 0.0f ){

tmpMin.x += this->m_pMotelToWorld->_11 * modelMin.x;
tmpMax.x += this->m_pMotelToWorld->_11 * modelMax.x;

}
else{

tmpMin.x += this->m_pMotelToWorld->_11 * modelMax.x;
tmpMax.x += this->m_pMotelToWorld->_11 * modelMin.x;

}

if( this->m_pMotelToWorld->_12 > 0.0f ){

tmpMin.y += this->m_pMotelToWorld->_12 * modelMin.y;
tmpMax.y += this->m_pMotelToWorld->_12 * modelMax.y;

}
else{

tmpMin.y += this->m_pMotelToWorld->_12 * modelMax.y;
tmpMax.y += this->m_pMotelToWorld->_12 * modelMin.y;

}

if( this->m_pMotelToWorld->_13 > 0.0f ){

tmpMin.z += this->m_pMotelToWorld->_13 * modelMin.z;
tmpMax.z += this->m_pMotelToWorld->_13 * modelMax.z;

}
else{

tmpMin.z += this->m_pMotelToWorld->_13 * modelMax.z;
tmpMax.z += this->m_pMotelToWorld->_13 * modelMin.z;

}

if( this->m_pMotelToWorld->_21 > 0.0f ){

tmpMin.x += this->m_pMotelToWorld->_21 * modelMin.x;
tmpMax.x += this->m_pMotelToWorld->_21 * modelMax.x;

}
else{

tmpMin.x += this->m_pMotelToWorld->_21 * modelMax.x;
tmpMax.x += this->m_pMotelToWorld->_21 * modelMin.x;

}

if( this->m_pMotelToWorld->_22 > 0.0f ){

tmpMin.y += this->m_pMotelToWorld->_22 * modelMin.y;
tmpMax.y += this->m_pMotelToWorld->_22 * modelMax.y;

}
else{

tmpMin.y += this->m_pMotelToWorld->_22 * modelMax.y;
tmpMax.y += this->m_pMotelToWorld->_22 * modelMin.y;

}

if( this->m_pMotelToWorld->_23 > 0.0f ){

tmpMin.z += this->m_pMotelToWorld->_23 * modelMin.z;
tmpMax.z += this->m_pMotelToWorld->_23 * modelMax.z;

}
else{

tmpMin.z += this->m_pMotelToWorld->_23 * modelMax.z;
tmpMax.z += this->m_pMotelToWorld->_23 * modelMin.z;

}

if( this->m_pMotelToWorld->_31 > 0.0f ){

tmpMin.x += this->m_pMotelToWorld->_31 * modelMin.x;
tmpMax.x += this->m_pMotelToWorld->_31 * modelMax.x;

}
else{

tmpMin.x += this->m_pMotelToWorld->_31 * modelMax.x;
tmpMax.x += this->m_pMotelToWorld->_31 * modelMin.x;

}

if( this->m_pMotelToWorld->_32 > 0.0f ){

tmpMin.y += this->m_pMotelToWorld->_32 * modelMin.y;
tmpMax.y += this->m_pMotelToWorld->_32 * modelMax.y;

}
else{

tmpMin.y += this->m_pMotelToWorld->_32 * modelMax.y;
tmpMax.y += this->m_pMotelToWorld->_32 * modelMin.y;

}

if( this->m_pMotelToWorld->_33 > 0.0f ){

tmpMin.z += this->m_pMotelToWorld->_33 * modelMin.z;
tmpMax.z += this->m_pMotelToWorld->_33 * modelMax.z;

}
else{

tmpMin.z += this->m_pMotelToWorld->_33 * modelMax.z;
tmpMax.z += this->m_pMotelToWorld->_33 * modelMin.z;

}

this->m_worldAABB.SetDetails( tmpMax, tmpMin );

}
饭团大暴走 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 P_hantom 的回复:]
先把模型进行坐标变换,每个顶点的位置就发生变化了,然后再用ComputeBoundingBox
[/Quote]

或者

[Quote=引用 2 楼 zhangci226 的回复:]
一样的,mesh模型旋转或移动时,都是乘以旋转或位移矩阵
把这个矩阵同样乘以包围盒的坐标就可以了
[/Quote]
张赐 2009-04-02
  • 打赏
  • 举报
回复
一样的,mesh模型旋转或移动时,都是乘以旋转或位移矩阵
把这个矩阵同样乘以包围盒的坐标就可以了
IONPhantom 2009-04-02
  • 打赏
  • 举报
回复
先把模型进行坐标变换,每个顶点的位置就发生变化了,然后再用ComputeBoundingBox

8,324

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧