• 大小: 719KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: 其他
  • 标签: 3ds  opengl  

资源简介

在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

评论

共有 条评论