⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3dsmodel.cpp

📁 多个3ds载入例子运行的时候有些慢候有些慢候有些慢
💻 CPP
字号:
// 3DSModel.cpp: implementation of the C3DSModel class.
//    
//     沈阳蓝雨视景科技
//     http://www.bvrain.com
//     bvrain@163.com  chglei@163.com
//     13998383976
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "3DSModel.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
C3DSModel::C3DSModel()
{
	m_sFileName[0]=0;
	m_bModelOK=FALSE;

	m_3DModel.numOfMaterials=0;
	m_3DModel.numOfObjects=0;
	m_3DModel.vctMaterials.clear();
	m_3DModel.vctObjects.clear();
}
C3DSModel::~C3DSModel()
{

	for(int i = 0; i < m_3DModel.numOfObjects; i++)
	{
		// Free the faces, normals, vertices, and texture coordinates.
		delete [] m_3DModel.vctObjects[i].pFaces;
		delete [] m_3DModel.vctObjects[i].pNormals;
		delete [] m_3DModel.vctObjects[i].pVerts;
		delete [] m_3DModel.vctObjects[i].pTexVerts;
		for(int j=0;j<m_3DModel.vctObjects[i].numOfMaterials;j++)
			delete[] m_3DModel.vctObjects[i].pMaterialREFS[j].pFaceIndexs;
		delete [] m_3DModel.vctObjects[i].pMaterialREFS;
	}

}
//绘制模型
BOOL C3DSModel::Draw()
{
	CLoad3DS::tMatREF *pmatref;
	CLoad3DS::tMaterialInfo *pmat;
	CLoad3DS::t3DObject *pObject;

	// 绘制所有的物体
	for(int i = 0; i < m_3DModel.numOfObjects; i++)
	{
		// 当前要显示的物体指针
		pObject = &m_3DModel.vctObjects[i];
		//对所有的子材料遍历
		for(int imat=0;imat<pObject->numOfMaterials;imat++)
		{
			//当前材料引用
			pmatref=&pObject->pMaterialREFS[imat];
			//当前材料
			pmat=&(m_3DModel.vctMaterials[pmatref->nMaterialID]);
			//使用材料
			glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,pmat->ambient);
			glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,pmat->diffuse);
			glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,pmat->specular);
			glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,pmat->emissive);
			//是否绑定纹理
			if(pmatref->bHasTexture) 
			{
				glEnable(GL_TEXTURE_2D);
				glEnable(GL_COLOR_MATERIAL);
				glColor3ub(255, 255, 255);
				glBindTexture(GL_TEXTURE_2D, m_3DModel.vctMaterials[pmatref->nMaterialID].texureId);//g_Texture[pObject->materialID]);
			} 
			else 
			{
				glDisable(GL_TEXTURE_2D);
				glDisable(GL_COLOR_MATERIAL);
			}	
			
			//开始绘制一个子物体
			glBegin(GL_TRIANGLES);
			//循环纹理相关的所有的面
			for(int nfindex = 0,j=0; nfindex < pmatref->nFaceNum; nfindex++)
			{
				//得到面索引号
				j=int(pmatref->pFaceIndexs[nfindex]);

				//绘制该面的三个顶点
				for(int whichVertex = 0; whichVertex < 3; whichVertex++)
				{
					// 得到顶点号
					int index = pObject->pFaces[j].vertIndex[whichVertex];
			
					// 设置法线
					glNormal3f(pObject->pNormals[ index ].x, pObject->pNormals[ index ].y, pObject->pNormals[ index ].z);
				
					// 如果改材料有纹理,就设置纹理坐标
					if(pmatref->bHasTexture)
					{
						if(pObject->pTexVerts) 
						{
							glTexCoord2f(pObject->pTexVerts[ index ].x, pObject->pTexVerts[ index ].y);
						}
					} 
					//绘制顶点
					glVertex3f(pObject->pVerts[ index ].x, pObject->pVerts[ index ].y, pObject->pVerts[ index ].z);
				}
			}
			glEnd();				
		}
	}
	return TRUE;
}
// 载入模型文件
BOOL C3DSModel::LoadModelFromFile(char* sfilename)
{
//静态序号
	static int ntextID=0;
	char stmp[512];
	//把文件名连接到媒体路径,成为完整路径
	strcpy(m_sFileName,sfilename);
	strcpy(stmp,g_sMediaPath);
	strcat(stmp,sfilename);
	
	//在这使用加载类
	CLoad3DS cLoad3ds;
	//载入文件
	if(cLoad3ds.Import3DS(&m_3DModel, stmp)==false)	
	{
		//失败
		m_bModelOK=FALSE;
		return FALSE;
	}
	//成功
	for(int i = 0; i < m_3DModel.numOfMaterials; i++)
	{
		// Check to see if there is a file name to load in this material
		if(strlen(m_3DModel.vctMaterials[i].strFile) > 0)
		{
			strcpy(stmp,g_sMediaPath);
			strcat(stmp,m_3DModel.vctMaterials[i].strFile);
			//此处改动,设置材料号
			CreateTexture(g_Texture,stmp , ntextID);	
			m_3DModel.vctMaterials[i].texureId = g_Texture[ntextID];
			ntextID++;

		}
		else
			m_3DModel.vctMaterials[i].texureId = 0;
	}
	m_bModelOK=TRUE;
	return TRUE;
}
//对齐到最低点(Y值)
void C3DSModel::AlignBottom()
{
	CLoad3DS::t3DObject *pObject;
	float fminy=10000;
	float foffset=0;
	int i=0;
	//找到最小Y
	for(i = 0; i < m_3DModel.numOfObjects; i++)
	{
		pObject = &m_3DModel.vctObjects[i];
		for(int j=0;j<pObject->numOfVerts;j++)
		{
			if(fminy>pObject->pVerts[j].y)fminy=pObject->pVerts[j].y;
		}
	}
	foffset=-fminy;
	//对齐所有点(平移)
	for(i = 0; i < m_3DModel.numOfObjects; i++)
	{
		pObject = &m_3DModel.vctObjects[i];
		for(int j=0;j<pObject->numOfVerts;j++)
		{
			pObject->pVerts[j].y+=foffset;
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -