资源简介
在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参考手册
- Qt Creator opengl实现四元数鼠标控制轨迹
- OpenGL文档,api大全,可直接查询函数
- opengl轮廓字体源代码
- MFC读三维模型obj文件
- 利用OpenGL写毛笔字算法
- MFC中OpenGL面和体的绘制以及动画效果
- 基于OPENGL的光线跟踪源代码368758
- VC 实现三维旋转(源码)
- 自编用openGL实现3D分形树,分形山
- OpenGL球形贴图自旋程序
- OpenGL导入贴图的Texture类
- 计算机图形学(openGL)代码
- 用OpenGL开发的机械臂运动仿真程序(
- OpenGL-3D坦克模拟
- OPENGL实现世界上最小的3D游戏
- VS2012OpenGL配置所需要的全部libdllh文件
- VRay 3.60.03 for 3dsmax 2013-2018破解补丁
- 基于OpenGL的仿蝗虫机器人三维动态仿
- 图形学 - OpenGL实现3种三维茶壶显示源
- opengl程序-会跳舞的骷髅
- opengl实现三维网格光顺Laplacian算法
- opengl——爆炸
- OpenGL三维地形建模
- opengl游戏编程徐明亮版(含源码)
- 用OPENGL画的一个简单的直升飞机
- opengl完美天空盒
- 3D绘图程序设计:使用Direct3D 10/9和Ope
- OpenGL绘制可运动自行车源程序.zip
- OpenGL实现飘动效果
评论
共有 条评论