- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验三3DMAX模型设计与VC调用
实验三 3DMAX模型设计与VC调用
一、实验目的与要求
学习3DMAX的数学原理、图形结构、文件格式;
掌握3DMAX系统模块、功能结构、图形绘制技术;
掌握3DMAX光照、材质、纹理、动画制作的基本原理;
掌握基于Visual C++环境调用3DS等格式文件的原理、过程与步骤;
掌握基于OpenGL环境控制3DMAX模型的原理、过程与步骤;
熟悉Visual C++、OpenGL与3DMAX的混合编程与接口技术。
二、实验仪器与设备
微型电子计算机 80台
Windows 2000以上版本操作系统 80套
Visual C++ 6.0开发系统 80套
3DMAX 7.0以上开发系统 80套
OpenGL 2.0以上函数库 80套
三、实验内容与步骤
1. 用Visual C++ 6.0、OpenGL为工具,基于Win32编写一段程序读取3DS文件
实验流程图
图3-1 基于Win32流程图
1.2主要代码
// 构造函数的功能是初始化tChunk数据
CLoad3DS::CLoad3DS()
{
m_CurrentChunk = new tChunk; // 初始化并为当前的块分配空间
m_TempChunk = new tChunk; // 初始化一个临时块并分配空间
}
// 打开一个3ds文件,读出其中的内容,并释放内存
bool CLoad3DS::Import3DS(t3DModel *pModel, char *strFileName)
{
char strMessage[255] = {0};
// 打开一个3ds文件
m_FilePointer = fopen(strFileName, rb);
// 确保所获得的文件指针合法
if(!m_FilePointer)
{
sprintf(strMessage, Unable to find the file: %s!, strFileName);
MessageBox(NULL, strMessage, Error, MB_OK);
return false;
}
// 当文件打开之后,首先应该将文件最开始的数据块读出以判断是否是一个3ds文件
// 如果是3ds文件的话,第一个块ID应该是PRIMARY
// 将文件的第一块读出并判断是否是3ds文件
ReadChunk(m_CurrentChunk);
// 确保是3ds文件
if (m_CurrentChunk-ID != PRIMARY)
{
sprintf(strMessage, Unable to load PRIMARY chuck from file: %s!, strFileName);
MessageBox(NULL, strMessage, Error, MB_OK);
return false;
}
// 现在开始读入数据,ProcessNextChunk()是一个递归函数
// 通过调用下面的递归函数,将对象读出
ProcessNextChunk(pModel, m_CurrentChunk);
// 在读完整个3ds文件之后,计算顶点的法线
ComputeNormals(pModel);
// 释放内存空间
CleanUp();
return true;
}
// 下面的函数释放所有的内存空间,并关闭文件
void CLoad3DS::CleanUp()
{
fclose(m_FilePointer); // 关闭当前的文件指针
delete m_CurrentChunk; // 释放当前块
delete m_TempChunk; // 释放临时块
}
// 下面的函数读出3ds文件的主要部分
void CLoad3DS::ProcessNextChunk(t3DModel *pModel, tChunk *pPreviousChunk)
{
t3DObject newObject = {0}; // 用来添加到对象链表
tMaterialInfo newTexture = {0}; // 用来添加到材质链表
unsigned int version = 0; // 保存文件版本
int buffer[50000] = {0}; // 用来跳过不需要的数据
m_CurrentChunk = new tChunk; // 为新的块分配空间
// 下面每读一个新块,都要判断一下块的ID,如果该块是需要读入的,则继续进行
// 如果是不需要读入的块,则略过
// 继续
原创力文档


文档评论(0)