现在来试试同一个模型在多处显示。在《OpenGL读取3DS文件显示 + 屏幕虚拟球旋转》的基础上加减。
一些全局变量:
#define genum 100 //显示数量,可以是任意的(简单一点,不显示零头)
typedef struct _boxbian //外框边界
{
float xmin,xmax,ymin,ymax,zmin,zmax;
}boxbian;
boxbian it;//模型边界
函数 getbian 放到初始化中:
it=getbian(&gothicModel);//获得模型外框边界
函数体:
//获得模型外框边界
boxbian getbian(t3DModel *Model)
{
float xmin,xmax,ymin,ymax,zmin,zmax,t;
xmin=ymin=zmin=9999999.0;//设置一个很大的值
xmax=ymax=zmax=-9999999.0;//设置一个很小的值
printf("对象个数:%d\n",Model->numOfObjects);
//printf("对象vector大小:%d\n",Model->pObject.size());
//遍历模型中的所有对象
for(unsigned int i=0;i<Model->pObject.size();i++)
{
//printf("第%d个对象的顶点个数:%d\n",i,Model->pObject[i].numOfVerts);
NBVector3 *pVerts; // 对象的顶点
pVerts=Model->pObject[i].pVerts;
//遍历对象中的所有顶点
for(int j=0;j<Model->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("xmin:%f,xmax:%f\n",xmin,xmax);
printf("ymin:%f,ymax:%f\n",ymin,ymax);
printf("zmin:%f,xmax:%f\n",zmin,zmax);
boxbian bian;
bian.xmax=xmax;bian.xmin=xmin;bian.ymax=ymax;bian.ymin=ymin;bian.zmax=zmax;bian.zmin=zmin;
return bian;
}
渲染模型方阵:
void drawdsMatrix(int ge)//方阵
{
//1、方阵宽和余数
int w=(int) sqrt((float)ge);//宽
int n=ge-w*w; //余数,暂时没用上
//2、外框 和间距
//按x、z方向排,计算总长
float xw=(it.xmax-it.xmin);//x方向长
float zw=(it.zmax-it.zmin);//z方向长
float g=max(xw,zw)/20;//间距
float xal=xw*w/2;//x方向总半长
float zal=zw*w/2;//z方向总半长
//分配模型地址
xal=-xal;//最左点
zal=-zal;
for (int i = 0; i < w; i++)
{
for (int j = 0; j < w; j++)
{
float xt1,yt1,zt1;
xt1=(xal+(xw+g)*i);
yt1= gothicTrans[1];
zt1= (zal+(zw+g)*j);
glTranslatef(xt1,yt1,zt1);// 放到这个位置
drawModel(gothicModel, true, false);//绘模型
glTranslatef(-xt1,-yt1,-zt1);//还原
}
}
}
在显示中替换:
//drawModel(gothicModel, true, false);//绘模型
drawdsMatrix(genum);
效果图: