由于3DS模型中分几个部分(模块),现在来研究下各个模块的相对运动,比如坦克的炮塔旋转,直升机螺旋浆转动
来看一下 T_HELI_L.3DS 这个直升机的组成:
for(unsigned int i=0;i<gothicModel.pObject.size();i++)
{
pVerts=gothicModel.pObject[i].pVerts;
//显示对象名称
printf("对象%d名称:%s\n",i,gothicModel.pObject[i].strName);
}
对象0名称:Camera01
对象1名称:Chasis03
对象2名称:Line01
对象3名称:Chasis01
对象4名称:Chasis02
对象5名称:Chasis05
对象6名称:Chasis06
对象7名称:Box03
对象8名称:Chasis
对象9名称:Rectangle1
也看不出哪个是螺旋浆。
到 CLoad3DS.cpp 的 drawModel 中依次增加 i 值:
// 遍历模型中所有的对象
//for(int i = 7; i < Model.numOfObjects; i++)
int i = 7;
原来螺旋浆的名称叫 Box03 。
下面来求旋转轴(外包围盒的中心):
//定义转动轴位置(螺旋浆中心)
GLfloat xt1=0.0f,zt1=0.0f;// 螺旋浆绕y轴转动,y用不动
NBVector3 *pVerts; // 对象的顶点
pVerts=gothicModel.pObject[i].pVerts;
//遍历对象中的所有顶点
for(int j=0;j<gothicModel.pObject[i].numOfVerts;j++)
{
//比较大小,留下最小和最大值
t=pVerts->x;
xmin=(t<xmin)?t:xmin;
xmax=(t>xmax)?t:xmax;
t=pVerts->y;
ymin=(t<ymin)?t:ymin;
ymax=(t>ymax)?t:ymax;
t=pVerts->z;
zmin=(t<zmin)?t:zmin;
zmax=(t>zmax)?t:zmax;
pVerts++;//下一个顶点
}
//显示对象名称
//printf("对象%d名称:%s\n",i,gothicModel.pObject[i].strName);
//外框一半是中心吗
xt1=xmin+(xmax-xmin)/2;//
zt1=zmin+(zmax-zmin)/2;
printf("xt1:%f,\n",xt1);
printf("zt1:%f,\n",zt1);
转动:
把CLoad3DS.cpp另存为CLoad3DS1.cpp
修改drawModel的代码
#include "CLoad3DS1.cpp"
float rquad=0.0;//转动量
void SpinDisplay()
{
rquad+=1.5f;// 旋转
if( rquad > 360 )
rquad -= 360;
glutPostRedisplay();
}
void drawModel(t3DModel Model,bool touming,bool outTex)
{
......//省略看原文
if(i==7){
glPushMatrix();//保存当前状态
glTranslatef(xt1,0.0f,zt1);//把原点移动螺旋浆中心
glRotatef(rquad,0.0f,1.0f,0.0f);// 绕y轴旋转
glTranslatef(-xt1,0.0f,-zt1);//还原到原位
}else if(i==8){
glPopMatrix();//恢复原样
}
......//省略看原文
}
glutIdleFunc( SpinDisplay );//main中注册旋转
哈哈,螺旋浆转动了,虽然跑到外面出去了。