关于三维物体缩放并转换坐标系的问题

leefantasy 2009-02-06 03:09:12
3ds文件有自己的一套坐标系,用opgl集成一个场景,导入多个3ds文件,对其进行包围盒视锥裁剪,需要将不同3ds文件中的点转换为统一坐标系下的坐标。

遇到这种情况,首先考虑的是平移操作。这个操作很简单。代码如下:

void C3DModleManager::CalculateRealCoord(t3DModel &TempModel, CS3dVector pos)
{
float g_max_x = -100000000;
float g_min_x = 100000000;
float g_max_y = -100000000;
float g_min_y = 100000000;
float g_max_z = -1000000000;
float g_min_z = 1000000000;
for (int i=0; i<TempModel.numOfObjects; i++)
{
float max_x = -10000000;
float min_x = 10000000;
float max_y = -10000000;
float min_y = 10000000;
float max_z = -10000000;
float min_z = 10000000;

for (int j=0; j<TempModel.pObject[i].numOfVerts; j++)
{
CVector3Simple EveryVert = TempModel.pObject[i].pVerts[j];

TempModel.pObject[i].pVertsGloabal[j].x = TempModel.pObject[i].pVerts[j].x + (pos.x-TempModel.m_Center.x);
TempModel.pObject[i].pVertsGloabal[j].y = TempModel.pObject[i].pVerts[j].y + (pos.y-TempModel.m_Center.y);
TempModel.pObject[i].pVertsGloabal[j].z = TempModel.pObject[i].pVerts[j].z + (pos.z-TempModel.m_Center.z);

EveryVert.x = TempModel.pObject[i].pVertsGloabal[j].x;
EveryVert.y = TempModel.pObject[i].pVertsGloabal[j].y;
EveryVert.z = TempModel.pObject[i].pVertsGloabal[j].z;

if(EveryVert.x>g_max_x)
g_max_x = EveryVert.x;
if(EveryVert.x<g_min_x)
g_min_x = EveryVert.x;
if(EveryVert.y>g_max_y)
g_max_y = EveryVert.y;
if(EveryVert.y<g_min_y)
g_min_y = EveryVert.y;
if(EveryVert.z>g_max_z)
g_max_z = EveryVert.z;
if(EveryVert.z<g_min_z)
g_min_z = EveryVert.z;
if(EveryVert.x>max_x)
max_x = EveryVert.x;
if(EveryVert.x<min_x)
min_x = EveryVert.x;
if(EveryVert.y>max_y)
max_y = EveryVert.y;
if(EveryVert.y<min_y)
min_y = EveryVert.y;
if(EveryVert.z>max_z)
max_z = EveryVert.z;
if(EveryVert.z<min_z)
min_z = EveryVert.z;
}
TempModel.pObject[i].m_BoundaryGlobal.maxx = max_x+1.0;
TempModel.pObject[i].m_BoundaryGlobal.maxy = max_y+1.0;
TempModel.pObject[i].m_BoundaryGlobal.maxz = max_z+1.0;
TempModel.pObject[i].m_BoundaryGlobal.minx = min_x-1.0;
TempModel.pObject[i].m_BoundaryGlobal.miny = min_y-1.0;
TempModel.pObject[i].m_BoundaryGlobal.minz = min_z-1.0;
}
TempModel.m_BoundaryGlobal.maxx = g_max_x;
TempModel.m_BoundaryGlobal.maxy = g_max_y;
TempModel.m_BoundaryGlobal.maxz = g_max_z;
TempModel.m_BoundaryGlobal.miny = g_min_y;
TempModel.m_BoundaryGlobal.minz = g_min_z;
}

调用语句为
my3DSCene.m_3DModle.CalculateRealCoord(my3DSCene.m_3DModle.m_ModelList[Index], my3DSCene.m_3DModle.m_ModelList[Index].m_Postion);


在缩放的时候,用如下函数:

void C3DModleManager::CalculateScaleCoord(t3DModel &TempModel, int EditAxis, float fScale)
{
for (int i=0; i<TempModel.numOfObjects; i++)
{
for (int j=0; j<TempModel.pObject[i].numOfVerts; j++)
{
switch (EditAxis)
{
case 1:
TempModel.pObject[i].pVerts[j].x = TempModel.pObject[i].pVerts[j].x * fScale;
break;
case 2:
TempModel.pObject[i].pVerts[j].y = TempModel.pObject[i].pVerts[j].y * fScale;
break;
case 3:
TempModel.pObject[i].pVerts[j].z = TempModel.pObject[i].pVerts[j].z * fScale;
break;
case 0:
TempModel.pObject[i].pVerts[j].x = TempModel.pObject[i].pVerts[j].x * fScale;
TempModel.pObject[i].pVerts[j].y = TempModel.pObject[i].pVerts[j].y * fScale;
TempModel.pObject[i].pVerts[j].z = TempModel.pObject[i].pVerts[j].z * fScale;
break;
default:
break;
}

}
}
}


之后再将缩放完毕的坐标进行坐标平移转换。

但是问题在于单独进行平移操作,视锥裁剪是正确的。如果进行了缩放之后,再平移,就错误了。我想错误可能是处在缩放的环节。还请高手看看错误在哪里?
...全文
179 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2009-02-10
  • 打赏
  • 举报
回复
我想错误可能是处在缩放的环节。还请高手看看错误在哪里?


代码没有细看,缩放后会改变顶点的法向量,缩放后重新单位化试试看,
zinking3 2009-02-08
  • 打赏
  • 举报
回复
啊,强烈建议你使用向量代数,看着太头晕了

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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