资源简介
在3dsmax下自制的椅子贴上纹理导出为3ds格式,将3ds文件采用glut编程的方法将其导入opengl中,并用鼠标左键实现旋转,右键实现缩放,ctrl+左键实现平移。
代码片段和文件信息
#include “main.h“
bool CLoad3DS::Import3DS(t3DModel *pModel char *strFileName)//********************************************************************
{
char strMessage[255] = {0};
tChunk currentChunk={0};
int i=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(¤tChunk);//读出块的id和块的size
// 确保是3ds文件
if (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 ¤tChunk);
// 在读完整个3ds文件之后,计算顶点的法线
ComputeNormals(pModel);
// 释放内存空间
CleanUp();
return true;
}
// 下面的函数释放所有的内存空间,并关闭文件
void CLoad3DS::CleanUp()//**************************************************************************
{
if(m_FilePointer)
{ fclose(m_FilePointer); // 关闭当前的文件指针
m_FilePointer=NULL;
}
}
// 下面的函数读出3ds文件的主要部分
void CLoad3DS::ProcessNextChunk(t3DModel *pModel tChunk *pPreviousChunk)//***************************************************************
{
t3Dobject newobject = {0}; // 用来添加到对象链表
tMaterialInfo newTexture = {0}; // 用来添加到材质链表
tChunk currentChunk={0}; // 用来添加到当前块链表
tChunk tempChunk={0}; // 用来添加到临时块链表
// unsigned int version = 0; // 保存文件版本
int gBuffer[50000] = {0}; // 用来跳过不需要的数据
// m_CurrentChunk = new tChunk; // 为新的块分配空间
// 下面每读一个新块,都要判断一下块的ID,如果该块是需要的读入的,则继续进行
// 如果是不需要读入的块,则略过
// 继续读入子块,直到达到预定的长度
while (pPreviousChunk->bytesRead < pPreviousChunk->length)
{
// 读入下一个块
ReadChunk(¤tChunk);
// 判断块的ID号
switch (currentChunk.ID)
{
case VERSION: // 文件版本号
// 在该块中有一个无符号短整型数保存了文件的版本
// 读入文件的版本号,并将字节数添加到bytesRead变量中
currentChunk.bytesRead += fread(gBuffer 1 currentChunk.length - currentChunk.bytesRead m_FilePointer);
// 如果文件版本号大于3,给出一个警告信息
if ((currentChunk.length - currentChunk.bytesRead==4)&&(gBuffer[0]> 0x03))
MessageBox(NULL “This 3DS file is over version 3 so it may load incorrectly“ “Warning“ MB_OK);
break;
case objectINFO: // 网格版本信息
// 读入下一个块
ReadChunk(&tempChunk);
// 获得网格的版本号
tempChunk.bytesRead += fread(gBuffer 1 tempChunk.length - tempChunk.bytesRead m_FilePointer);
// 增加读入的字节数
currentChunk.bytesRead += tempChunk.bytesRead;
// 进入下一个块
ProcessNextChunk(pModel ¤tChunk);
break;
case MATERIAL: // 材质信息
// 材质的数目递增
pModel->numOfMaterials++;
// 在纹理链表中添加一个空白纹理结构
pModel->vctMaterials.push_back(newTex
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 20764 2012-09-26 14:05 3ds.cpp
文件 10438 2012-09-26 13:57 main.cpp
文件 5695 2012-09-25 23:55 main.h
文件 413862 2012-09-25 21:15 mucai110.bmp
文件 196662 2012-09-25 21:08 pige132.bmp
文件 579654 2012-09-25 21:18 qiangzhi.bmp
文件 4063 2012-09-25 22:10 ren.dsp
文件 512 2012-09-25 11:53 ren.dsw
文件 190389 2012-09-25 21:54 wenli4.3DS
相关资源
- opengl中点画圆法
- opengl编程指南第7版源代码
- 3D酷炫屏幕保护程序OpenGL
- OpenGL文件.zip
- 3dsmax2018keygen64.rar
- 配置OpenGL以及glaux所需资源.h.dll
- luweiqi素材
- VS2017&OpenGL;环境搭建
- OpenGL 顶点数组+拾取
- openGL配置资源文件,含32/64位
- GLPrint_demo
- 圆球圆环构造opengl函数
- opengl画圆柱体直接函数法,逼近法
- openGl立方体纹理贴图
- OpenGL 库glut读取obj文件并使用显示列表
- 3DsMAX人体骨骼模型可用于OPENGL读取处
- gultopengl开发安装包
- opengl实现的飞机
- opengl 绘制 棱锥
- 3dsMax快速建模专用脚本40多个必备ma
- opengl光照小
- 无法打开包括文件 gl glaux.h No such fi
- openGL打包库
- 3DsMax中文在线-教程帮助文档
- opengl+vc写的太阳系演示源代码包含三
- OpenGL、FreeType 中文纹理绘制
- OpenGL 房子小院
- 基于OpenGL的贝塞尔曲线算法的实现
- 一个3d 飞机模型 可用opengl读取
- 基于openGL、pygame增强现实的视频实现
评论
共有 条评论