3DS (3D-Studio) 三维模型文件解析器。
3DS 是 Autodesk 3ds Max 使用的旧版标准交换格式。 采用分块(Chunk)存储结构,支持网格几何数据、材质定义、 纹理坐标以及局部变换矩阵的解析。
注意:.max 是 3ds Max 的专有私有格式(无公开文档,无法可靠解析), 本模块解析的是 .3ds 格式文件。
3DS (3D-Studio) 三维模型文件解析器。
3DS 是 Autodesk 3ds Max 使用的旧版标准交换格式。 采用分块(Chunk)存储结构,支持网格几何数据、材质定义、 纹理坐标以及局部变换矩阵的解析。
注意:.max 是 3ds Max 的专有私有格式(无公开文档,无法可靠解析), 本模块解析的是 .3ds 格式文件。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| Parse3DS | 2 | 从 Stream 解析 3DS 模型数据 |
| ReadChunkTree | 1 | 递归读取 Chunk 树结构。 从当前流位置开始,读取所有子 Chunk 直到父 Chunk 结束。 |
| ReadChunk | 1 | 从 BinaryReader 读取单个 Chunk 的头部信息(6 字节) |
| HasSubChunks | 1 | 判断该 Chunk 类型是否包含子 Chunk |
| ParseMainChunk | 1 | 解析根 Chunk(MAIN3DS 0x4D4D) |
| ParseEdit3DS | 1 | 解析 3D 编辑器 Chunk(EDIT3DS 0x3D3D) |
| ParseObjectBlock | 1 | 解析对象定义块(EDIT_OBJECT 0x4000) |
| ParseMeshBlock | 1 | 解析网格数据块(OBJ_MESH 0x4100) |
| ReadVertexList | 1 | 读取顶点列表(MESH_VERTICES 0x4110) 格式:UInt16 count + count × (Single X, Single Y, Single Z) |
| ReadFaceList | 1 | 读取三角面列表(MESH_FACES 0x4120) 格式:UInt16 count + count × (UInt16 A, UInt16 B, UInt16 C, UInt16 faceInfo) faceInfo: bit0=AC可见, bit1=BC可见, bit2=AB可见 |
| ReadMaterialFaceMap | 1 | 读取面材质分配表(MESH_FACE_MAT 0x4130) 格式:以 null 结尾的材质名 + UInt16 count + count × UInt16 faceIndex |
| ReadTextureVertices | 1 | 读取纹理坐标(MESH_TEX_VERT 0x4140) 格式:UInt16 count + count × (Single U, Single V) |
| ReadLocalMatrix | 1 | 读取局部变换矩阵(MESH_MATRIX 0x4160) 格式:12 × Single(4×3 矩阵,行主序) 第 4 列隐含为 [0, 0, 0, 1] |
| ApplyLocalMatrix | 1 | 应用局部变换矩阵到顶点。 矩阵为 4×3 行主序:前三行每行 3 个元素为旋转/缩放, 第四行 3 个元素为平移。 |
| ParseMaterialBlock | 1 | 解析材质定义块(EDIT_MATERIAL 0xAFFF) |
| ParseMaterialColor | 1 | 解析材质颜色子 Chunk(MAT_DIFFUSE / MAT_AMBIENT / MAT_SPECULAR) 这些 Chunk 包含 COLOR_F 或 COLOR_24 子 Chunk |
| ParseTextureMap | 1 | 解析纹理贴图(MAT_TEXMAP 0xA200) |
| ReadColorFloat | 1 | 读取浮点 RGB 颜色(COLOR_F):3 × Single (R, G, B) |
| ReadColorByte | 1 | 读取字节 RGB 颜色(COLOR_24):3 × Byte (R, G, B),映射到 0.0 ~ 1.0 |
| ReadNullTerminatedString | 1 | 读取以 null(&H00)结尾的 ASCII 字符串 |
| BuildSceneModel | 1 | 将所有解析出的网格和材质组装为 SceneModel |
03 Members
String)从文件路径解析 3DS 模型文件
| Name | Type | Description |
|---|---|---|
filePath$ | String | .3ds 文件路径 |
解析后的 SceneModel
Stream)从 Stream 解析 3DS 模型数据
| Name | Type | Description |
|---|---|---|
stream | Stream | 包含 3DS 数据的流 |
解析后的 SceneModel
BinaryReader, Chunk3DS)递归读取 Chunk 树结构。 从当前流位置开始,读取所有子 Chunk 直到父 Chunk 结束。
BinaryReader)从 BinaryReader 读取单个 Chunk 的头部信息(6 字节)
UInt16)判断该 Chunk 类型是否包含子 Chunk
BinaryReader, Chunk3DS)解析根 Chunk(MAIN3DS 0x4D4D)
解析 3D 编辑器 Chunk(EDIT3DS 0x3D3D)
BinaryReader, Chunk3DS)解析对象定义块(EDIT_OBJECT 0x4000)
BinaryReader, Chunk3DS)解析网格数据块(OBJ_MESH 0x4100)
BinaryReader, Mesh3DS)读取顶点列表(MESH_VERTICES 0x4110) 格式:UInt16 count + count × (Single X, Single Y, Single Z)
BinaryReader, Mesh3DS)读取三角面列表(MESH_FACES 0x4120) 格式:UInt16 count + count × (UInt16 A, UInt16 B, UInt16 C, UInt16 faceInfo) faceInfo: bit0=AC可见, bit1=BC可见, bit2=AB可见
BinaryReader, Mesh3DS)读取面材质分配表(MESH_FACE_MAT 0x4130) 格式:以 null 结尾的材质名 + UInt16 count + count × UInt16 faceIndex
BinaryReader, Mesh3DS)读取纹理坐标(MESH_TEX_VERT 0x4140) 格式:UInt16 count + count × (Single U, Single V)
BinaryReader, Mesh3DS)读取局部变换矩阵(MESH_MATRIX 0x4160) 格式:12 × Single(4×3 矩阵,行主序) 第 4 列隐含为 [0, 0, 0, 1]
应用局部变换矩阵到顶点。 矩阵为 4×3 行主序:前三行每行 3 个元素为旋转/缩放, 第四行 3 个元素为平移。
BinaryReader, Chunk3DS)解析材质定义块(EDIT_MATERIAL 0xAFFF)
解析材质颜色子 Chunk(MAT_DIFFUSE / MAT_AMBIENT / MAT_SPECULAR) 这些 Chunk 包含 COLOR_F 或 COLOR_24 子 Chunk
解析纹理贴图(MAT_TEXMAP 0xA200)
BinaryReader)读取浮点 RGB 颜色(COLOR_F):3 × Single (R, G, B)
BinaryReader)读取字节 RGB 颜色(COLOR_24):3 × Byte (R, G, B),映射到 0.0 ~ 1.0
BinaryReader)读取以 null(&H00)结尾的 ASCII 字符串
List(Of Mesh3DS), Dictionary(Of String, Material3DS))将所有解析出的网格和材质组装为 SceneModel