3ds模型--单模方阵(一模多用)

现在来试试同一个模型在多处显示。在《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);
效果图:







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值