XML通过自定义标签结构可以清晰描述3D模型的几何信息和纹理信息,核心是将三维网格的顶点、面片、法线等数据和纹理坐标、纹理资源路径等数据按层级组织,形成标准化的描述格式。

XML描述3D模型的核心结构
一个完整的3D模型XML描述通常包含根节点、几何数据节点、纹理数据节点三个核心部分,根节点用于标识模型整体信息,几何节点存储三维网格的核心数据,纹理节点存储纹理相关的配置信息。
根节点定义
根节点可以自定义名称,通常包含模型名称、版本、坐标系类型等基础属性,方便解析时快速获取模型的整体配置。
几何数据节点结构
几何数据节点下需要分别定义顶点列表、面片列表、法线列表、纹理坐标列表,每个列表下的子节点对应单条数据,保证数据的结构化和可扩展性。
纹理数据节点结构
纹理节点需要包含纹理资源的存储路径、纹理类型、纹理参数等信息,如果有多个纹理可以设置多个子节点,分别对应漫反射、法线、高光等不同纹理类型。
完整XML示例
以下是一个描述简单立方体的XML示例,包含8个顶点、6个面片、对应的法线和纹理坐标,以及一张漫反射纹理的配置:
<?xml version="1.0" encoding="UTF-8"?>
<Model name="cube" version="1.0" coordinate="right-handed">
<Geometry>
<Vertices>
<Vertex id="0">
<x>-1.0</x>
<y>-1.0</y>
<z>-1.0</z>
</Vertex>
<Vertex id="1">
<x>1.0</x>
<y>-1.0</y>
<z>-1.0</z>
</Vertex>
<Vertex id="2">
<x>1.0</x>
<y>1.0</y>
<z>-1.0</z>
</Vertex>
<Vertex id="3">
<x>-1.0</x>
<y>1.0</y>
<z>-1.0</z>
</Vertex>
<Vertex id="4">
<x>-1.0</x>
<y>-1.0</y>
<z>1.0</z>
</Vertex>
<Vertex id="5">
<x>1.0</x>
<y>-1.0</y>
<z>1.0</z>
</Vertex>
<Vertex id="6">
<x>1.0</x>
<y>1.0</y>
<z>1.0</z>
</Vertex>
<Vertex id="7">
<x>-1.0</x>
<y>1.0</y>
<z>1.0</z>
</Vertex>
</Vertices>
<Faces>
<Face id="0">
<v1>0</v1>
<v2>1</v2>
<v3>2</v3>
</Face>
<Face id="1">
<v1>0</v1>
<v2>2</v2>
<v3>3</v3>
</Face>
<Face id="2">
<v1>4</v1>
<v2>5</v2>
<v3>6</v3>
</Face>
<Face id="3">
<v1>4</v1>
<v2>6</v2>
<v3>7</v3>
</Face>
<Face id="4">
<v1>0</v1>
<v2>4</v2>
<v3>7</v3>
</Face>
<Face id="5">
<v1>0</v1>
<v2>7</v2>
<v3>3</v3>
</Face>
<Face id="6">
<v1>1</v1>
<v2>5</v2>
<v3>6</v3>
</Face>
<Face id="7">
<v1>1</v1>
<v2>6</v2>
<v3>2</v3>
</Face>
<Face id="8">
<v1>0</v1>
<v2>5</v2>
<v3>1</v3>
</Face>
<Face id="9">
<v1>0</v1>
<v2>4</v2>
<v3>5</v3>
</Face>
<Face id="10">
<v1>3</v1>
<v2>2</v2>
<v3>6</v3>
</Face>
<Face id="11">
<v1>3</v1>
<v2>6</v2>
<v3>7</v3>
</Face>
</Faces>
<Normals>
<Normal id="0">
<x>0.0</x>
<y>0.0</y>
<z>-1.0</z>
</Normal>
<Normal id="1">
<x>0.0</x>
<y>0.0</y>
<z>1.0</z>
</Normal>
<Normal id="2">
<x>-1.0</x>
<y>0.0</y>
<z>0.0</z>
</Normal>
<Normal id="3">
<x>1.0</x>
<y>0.0</y>
<z>0.0</z>
</Normal>
<Normal id="4">
<x>0.0</x>
<y>-1.0</y>
<z>0.0</z>
</Normal>
<Normal id="5">
<x>0.0</x>
<y>1.0</y>
<z>0.0</z>
</Normal>
</Normals>
<TexCoords>
<TexCoord id="0">
<u>0.0</u>
<v>0.0</v>
</TexCoord>
<TexCoord id="1">
<u>1.0</u>
<v>0.0</v>
</TexCoord>
<TexCoord id="2">
<u>1.0</u>
<v>1.0</v>
</TexCoord>
<TexCoord id="3">
<u>0.0</u>
<v>1.0</v>
</TexCoord>
</TexCoords>
</Geometry>
<Textures>
<Texture id="diffuse" type="diffuse">
<Path>http://ipipp.com/textures/cube_diffuse.png</Path>
<WrapMode>repeat</WrapMode>
<FilterMode>linear</FilterMode>
</Texture>
</Textures>
</Model>
XML解析示例
以下是使用Python解析上述XML模型数据的示例代码,提取顶点和面片信息:
import xml.etree.ElementTree as ET
def parse_xml_model(xml_path):
tree = ET.parse(xml_path)
root = tree.getroot()
# 提取模型基础信息
model_name = root.get("name")
print(f"模型名称: {model_name}")
# 提取顶点数据
vertices = []
vertex_nodes = root.findall("./Geometry/Vertices/Vertex")
for v_node in vertex_nodes:
x = float(v_node.find("x").text)
y = float(v_node.find("y").text)
z = float(v_node.find("z").text)
vertices.append((x, y, z))
print(f"顶点数量: {len(vertices)}")
# 提取面片数据
faces = []
face_nodes = root.findall("./Geometry/Faces/Face")
for f_node in face_nodes:
v1 = int(f_node.find("v1").text)
v2 = int(f_node.find("v2").text)
v3 = int(f_node.find("v3").text)
faces.append((v1, v2, v3))
print(f"面片数量: {len(faces)}")
# 提取纹理路径
texture_path = root.find("./Textures/Texture/Path").text
print(f"漫反射纹理路径: {texture_path}")
return vertices, faces, texture_path
# 调用解析函数
vertices, faces, tex_path = parse_xml_model("cube_model.xml")
规范格式注意事项
- 顶点、面片、法线、纹理坐标的ID需要保持唯一,方便后续数据关联
- 面片引用的顶点ID必须在顶点列表中存在,避免解析时出现越界错误
- 纹理路径尽量使用相对路径,方便模型文件和资源文件的整体迁移
- 可以添加可选的<Material>节点扩展材质信息,比如漫反射颜色、高光强度等参数
XML描述3D模型的格式可以根据实际需求灵活扩展,只要保证结构统一、数据完整,就可以满足不同场景下的3D模型存储和传输需求。
XML3D_modelmesh_datatexture_data修改时间:2026-07-20 00:30:55