阅读目录(Content)

  • 3DS文件格式
  • 块(Chunk)的结构
  • 解析结果

自制C#版3DS文件的解析器并用SharpGL显示3DS模型

我已经重写了3ds解析器,详情在此(http://www.cnblogs.com/bitzhuwei/p/CSharpGL-2-parse-3ds-file-and-render-using-CSharpGL.html)
+BIT祝威+悄悄在此留下版了个权的信息说:

据说*.3ds格式的3D模型文件是很古老和过时的格式。本文参考了(http://www.spacesimulator.net/wiki/index.php?title=Tutorials:3ds_Loader)和(http://www.cnblogs.com/lookof/archive/2009/03/27/1423695.html),在此表示感谢。本文讲解如何从零开始用C#写一个3ds文件的解析器,然后用SharpGL(C#对opengl的封装)来显示3ds模型。有图有真相。

上图使用的3ds模型文件和贴图文件在此。(spaceship.zip)(spaceshiptexture.bmp)

回到顶部(go to top)

3DS文件格式

+BIT祝威+悄悄在此留下版了个权的信息说:

3ds文件是二进制的。3ds格式的基本单元叫块(chunk)。我们就是读这样一块一块的信息。目录树如下,缩进风格体现了块的父子关系。可见3ds模型文件和XML文件类似,都是只有1个根结点的树状结构。

 1 MAIN CHUNK 0x4D4D
 2    3D EDITOR CHUNK 0x3D3D
 3       OBJECT BLOCK 0x4000
 4          TRIANGULAR MESH 0x4100
 5             VERTICES LIST 0x4110
 6             FACES DESCRIPTION 0x4120
 7                FACES MATERIAL 0x4130
 8             MAPPING COORDINATES LIST 0x4140
 9                SMOOTHING GROUP LIST 0x4150
10             LOCAL COORDINATES SYSTEM 0x4160
11          LIGHT 0x4600
12             SPOTLIGHT 0x4610
13          CAMERA 0x4700
14       MATERIAL BLOCK 0xAFFF
15          MATERIAL NAME 0xA000
16          AMBIENT COLOR 0xA010
17          DIFFUSE COLOR 0xA020
18          SPECULAR COLOR 0xA030
19          TEXTURE MAP 1 0xA200
20          BUMP MAP 0xA230
21          REFLECTION MAP 0xA220
22          [SUB CHUNKS FOR EACH MAP]
23             MAPPING FILENAME 0xA300
24             MAPPING PARAMETERS 0xA351
25       KEYFRAMER CHUNK 0xB000
26          MESH INFORMATION BLOCK 0xB002
27          SPOT LIGHT INFORMATION BLOCK 0xB007
28          FRAMES (START AND END) 0xB008
29             OBJECT NAME 0xB010
30             OBJECT PIVOT POINT 0xB013
31             POSITION TRACK 0xB020
32             ROTATION TRACK 0xB021
33             SCALE TRACK 0xB022
34             HIERARCHY POSITION 0xB030

3DS块结构

+BIT祝威+悄悄在此留下版了个权的信息说:

实际上完整的chunk列表有上千种类型,我们只需解析其中的顶点列表、面列表和纹理UV列表就行了。

以类型标识为0x4D4D的MAIN CHUNK为例,整个3ds文件的前两个byte必须是0x4D4D,否则就说明这个文件不是3ds模型文件。然后从第3到第6个byte是一个Uint32型的数值,表示整个MAIN CHUNK的长度。由于MAIN CHUNK是整个3ds文件的根结点,它的长度也即整个3ds文件的长度。

回到顶部(go to top)

块(Chunk)的结构

每一个“chunk”的结构如下所示:

偏移量

长度

0

2

块标识符

2

4

块长: 块数据 + 子块内容

6

n

块数据

6+n

m

S子块

+BIT祝威+悄悄在此留下版了个权的信息说:

读取的思路是:首先根据偏移量和长度找到一个块的标识符,然后据此来判断它是什么块,遇到我们需要的块,就进一步读取,如果不需要,直接跳过这一块,读取下面的块。

我们的解析器需要顶点、面和贴图UV信息,根据3ds模型文件的树状结构,可以找到需要解析的Chunk如下。

MAIN CHUNK

Identifier

0x4d4d

Length

0 + sub-chunks length

Chunk father

None

Sub chunks

3D EDITOR CHUNK

Data

None

3D EDITOR CHUNK

Identifier

0x3D3D

Length

0 + sub-chunks length

Chunk father

MAIN CHUNK

Sub chunks

OBJECT BLOCK, MATERIAL BLOCK, KEYFRAMER CHUNK

Data

None

OBJECT BLOCK

Identifier

0x4000

Length

Object name length + sub-chunks length

Chunk father

3D EDITOR CHUNK

Sub chunks

TRIANGULAR MESH, LIGHT, CAMERA

Data

Object name

TRIANGULAR MESH

Identifier

0x4100

Length

0 + sub-chunks length

Chunk father

OBJECT BLOCK

Sub chunks

VERTICES LIST, FACES DESCRIPTION, MAPPING COORDINATES LIST

Data

None

VERTICES LIST(点数据在这)

Identifier

0x4110

Length

varying + sub-chunks length

Chunk father

TRIANGULAR MESH

Sub chunks

None

Data

Vertices number (unsigned short)
Vertices list: x1,y1,z1,x2,y2,z2 etc. (for each vertex: 3*float)

FACES DESCRIPTION(面数据在这)

Identifier

0x4120

Length

varying + sub-chunks length

Chunk father

TRIANGULAR MESH

Sub chunks

FACES MATERIAL

Data

Polygons number (unsigned short)
Polygons list: a1,b1,c1,a2,b2,c2 etc. (for each point: 3*unsigned short)
Face flag: face options, sides visibility etc. (unsigned short)

MAPPING COORDINATES LIST(贴图数据在这)

Identifier

0x4140

Length

varying + sub-chunks length

Chunk father

TRIANGULAR MESH

Sub chunks

SMOOTHING GROUP LIST

Data

Vertices number (unsigned short)
Mapping coordinates list: u1,v1,u2,v2 etc. (for each vertex: 2*float)

据此给出Chunk的枚举类型

 1         enum ChunkType
 2         {
 3             MainChunk = 0x4D4D,
 4             _3DEditorChunk = 0x3D3D,
 5             CVersion = 0x0002,
 6             KeyFramerChunk = 0xB000,
 7             MaterialBlock = 0xAFFF,
 8             MaterialName = 0xA000,
 9             AmbientColor = 0xA010,
10             DiffuseColor = 0xA020,
11             SpecularColor = 0xA030,
12             C_MATSHININESS = 0xA040,
13             TextureMap = 0xA200,
14             MappingFilename = 0xA300,
15             ObjectBlock = 0x4000,
16             TriangularMesh = 0x4100,
17             VerticesList = 0x4110,
18             FacesDescription = 0x4120,
19             FacesMaterial = 0x4130,
20             MappingCoordinatesList = 0x4140
21         }

ChunkType

回到顶部(go to top)

解析结果

+BIT祝威+悄悄在此留下版了个权的信息说:

解析结果为一个3dsFile类型的实例,它包含若干模型(称为entity)。每个entity都含有描述三维模型的顶点、面和贴图UV信息,据此我们用SharpGL来将其显示出来。

 1          foreach (var entity in _3dsFile.Entities)
 2          {
 3                    gl.Enable(OpenGL.GL_TEXTURE_2D);
 4                    gl.BindTextue(OpenGL.GL_TEXTURE_2D, this.texture.TextureName);
 5                    gl.Begin(SharpGL.Enumerations.BeginMode.Triangles);
 6                    foreach (var triangle in entity.indices)
 7                    {
 8                             var point1 = entity.vertices[triangle.vertex1];
 9                             var uv1 = entity.texcoords[triangle.vertex1];
10                             gl.TexCoord(uv1.U, uv1.V);
11                             gl.Vertex(point1.X, point1.Y, point1.Z);
12                             var point2 = entity.vertices[triangle.vertex2];
13                             var uv2 = entity.texcoords[triangle.vertex2];
14                             gl.TexCoord(uv2.U, uv2.V);
15                             gl.Vertex(point2.X, point2.Y, point2.Z);
16                             var point3 = entity.vertices[triangle.vertex3];
17                             var uv3 = entity.texcoords[triangle.vertex3];
18                             gl.TexCoord(uv3.U, uv3.V);
19                             gl.Vertex(point3.X, point3.Y, point3.Z);
20                    }
21                    gl.End();
22          }
23
24  

用SharpGL显示3DS模型

需要注意的一点是,SharpGL加载的贴图是上下反向的,所以你必须把准备好的贴图上下翻转,才能在SharpGL里正常使用。

+BIT祝威+悄悄在此留下版了个权的信息说:

说起来容易做起来难,需要源码的同学麻烦支持一下,捐款100元并留下你的Email等联系方式。您也可以在公告栏找到我的联系方式,任何不直接索要源码的交流都是欢迎的!

如果您愿意花几块钱请我喝杯茶的话,可以用手机扫描下方的二维码,通过支付宝或者微信捐赠。我会努力写出更好的文章。
Thank you for your kindly donation!

支付宝捐赠二维码:
Donate by alipay:
微信捐赠二维码:
Donate by microMsg:
 

自制C#版3DS文件的解析器并用SharpGL显示3DS模型相关推荐

  1. python学习之多进程小练笔:简版多进程文件夹copy器

    简版多进程文件夹copy器 在学习python多进程后,为了能快速掌握其中的知识点,就写了一个简单的多进程文件copy器. 主要的功能:在输入想要复制的文件后就会自动形成一个复制好的文件,还会有传输进 ...

  2. 3DS文件在OpenGL的读入和显示

    3DS文件在OpenGL的读入和显示 学习了Blender之后,很想将自己设计的模型载入自己编写的程序中,因此考虑了比较常见的3DS文件格式.这回尝试着将3DS文件载入自己写的OpenGL程序并且显示 ...

  3. Python制作 .fasta文件的解析器

    FASTA文件是整个生物信息学,基因组学和进化生物学中使用的最常见的序列格式之一.主要用于存储核酸序列,但是FASTA文件的扩展名差异很大,有时可能是.fasta,有时也可能是.fas或.fna. 在 ...

  4. 自制编程语言crowbar(v0.1)构建解析器时分配内存

    crowbar中第一次申请内存是在生成解析器的时候: /* interface.c */CRB_Interpreter *CRB_create_interpreter(void) {MEM_Stora ...

  5. 山寨一个ini文件的解析器

    2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/pikeman/blog/194904

  6. CSharpGL(5)解析3DS文件并用CSharpGL渲染

    CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...

  7. 解析器生成器 ANTLR的详细介绍

    什么是ANTLR ANTLR(Another Tool for Language Recognition)是一个强大的解析器生成器,用于读取.处理.执行和翻译结构化文本或二进制文件.它被广泛应用于构建 ...

  8. wireshark协议解析器原理与插件编写

    工作原理 每个解析器解码自己的协议部分, 然后把封装协议的解码传递给后续协议. 因此它可能总是从一个Frame解析器开始, Frame解析器解析捕获文件自己的数据包细节(如:时间戳), 将数据交给一个 ...

  9. JAVA与DOM解析器基础 学习笔记

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理 ...

最新文章

  1. ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信
  2. 《文献管理与信息分析》课程学习笔记
  3. 天池 在线编程 最佳利用率(二分查找 + 哈希)
  4. 太阳花图片_长寿花扔水里,光长叶不开花?赶紧加点营养液
  5. JAVA NIO基础知识
  6. Java实现图片文件的上传和获取
  7. 在小程序端获取数据库所有符合条件的数据(使用分页突破20条限制)
  8. hdu 3183(贪心)
  9. C#读取网络流,读取网络上的js文件
  10. 论文查重率这么高,是由什么原因造成的?
  11. 优化模型之指派问题(整数规划)
  12. 金蝶K3案例教程总账后台配置
  13. R语言 使用getGEO()直接进行差异表达分析并显示Entrez_id和Symbol_id
  14. python秒杀神器苏宁_python实现自动登录 签到 京东 苏宁
  15. 基于java网上体育用品商城系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  16. 区块链知识转载博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
  17. android n 下载地址,android N镜像文件下载地址
  18. 分布式光伏运维服务器,户用分布式光伏电站运维指导手册——运维及安全
  19. 计算机基础知识赏花主观题,春光无限好,正是花开时 快收好这份赏花指南!...
  20. idea指定maven的settings文件不生效

热门文章

  1. EasyNVR分屏切换时视频源丢失问题的优化分享
  2. 请使用java编写自定义麻将游戏
  3. 计算机室内设计绘图论文,浅析计算机辅助室内设计.doc
  4. java 缓存命中率_Redis缓存命中率
  5. Elasticsearch能把普通的sql翻译成DSL的插件
  6. 世界冠军 | 腾讯AI Lab斩获知识图谱顶级赛事KBP 2017世界冠军
  7. Java多线程--使用ThreadMXBean 打出堆栈信息
  8. 论文阅读:RA-Depth: Resolution Adaptive Self-Supervised Monocular Depth Estimation
  9. SAP ABAP - 实现语音消息提醒
  10. 国产化下jmeter的适配