Appearance
【在线Shader测试】
以下是Blender脚本,可以生成模型信息,用于测试。
python
import bpy
import bmesh
from mathutils import Vector
import os
def export_mesh_data():
# 获取当前选中的物体
obj = bpy.context.active_object
if not obj or obj.type != 'MESH':
print("请选择一个网格物体")
return
# 创建一个临时的bmesh来处理数据
bm = bmesh.new()
bm.from_mesh(obj.data)
# 确保mesh被三角化
bmesh.ops.triangulate(bm, faces=bm.faces)
# 获取UV层
uv_layer = bm.loops.layers.uv.active
if not uv_layer:
print("模型需要UV坐标")
return
# 获取顶点颜色层
color_layer = bm.loops.layers.color.active
if not color_layer:
print("警告:模型没有顶点颜色层,将使用默认白色")
# 准备数据字符串
vertices_data = []
uv_data = []
normal_data = []
color_data = [] # 新增顶点颜色数据列表
# 遍历所有面
for face in bm.faces:
# 获取三角形的三个顶点
for loop in face.loops:
# 获取顶点坐标并转换到-0.5到0.5范围
vert = loop.vert.co
normalized_vert = Vector((
vert.x / 2.0,
vert.y / 2.0,
vert.z / 2.0
))
# 获取UV坐标
uv = loop[uv_layer].uv
# 获取顶点法线
normal = loop.vert.normal
# 获取顶点颜色,如果没有颜色层则使用白色
if color_layer:
color = loop[color_layer]
color_data.append(f"vec4({color[0]:.4f},{color[1]:.4f},{color[2]:.4f},{color[3]:.4f})")
else:
color_data.append("vec4(1.0,1.0,1.0,1.0)")
# 添加到数据列表
vertices_data.append(f"vec3({normalized_vert.x:.4f},{normalized_vert.y:.4f},{normalized_vert.z:.4f})")
uv_data.append(f"vec2({uv.x:.4f}, {1-uv.y:.4f})")
normal_data.append(f"vec3({normal.x:.4f},{normal.y:.4f},{normal.z:.4f})")
# 释放bmesh
bm.free()
# 创建输出文件
output_path = "D:/mesh_data.txt"
with open(output_path, "w") as f:
# 写入顶点数据
f.write("// 顶点数据\n")
f.write(f"#define TriangleCount {len(vertices_data)//3}\n\n")
f.write("const vec3 triangles[3*TriangleCount] = vec3[](\n")
for i in range(0, len(vertices_data), 3):
line = ", ".join(vertices_data[i:i+3])
if i < len(vertices_data) - 3:
line += ","
f.write(line + "\n")
f.write(");\n\n")
# 写入UV数据
f.write("// UV数据\n")
f.write("const vec2 triangleUVs[3*TriangleCount] = vec2[](\n")
for i in range(0, len(uv_data), 3):
line = ", ".join(uv_data[i:i+3])
if i < len(uv_data) - 3:
line += ","
f.write(line + "\n")
f.write(");\n\n")
# 写入法线数据
f.write("// 法线数据\n")
f.write("const vec3 triangleNormals[3*TriangleCount] = vec3[](\n")
for i in range(0, len(normal_data), 3):
line = ", ".join(normal_data[i:i+3])
if i < len(normal_data) - 3:
line += ","
f.write(line + "\n")
f.write(");\n\n")
# 写入顶点颜色数据
f.write("// 顶点颜色数据\n")
f.write("const vec4 triangleColors[3*TriangleCount] = vec4[](\n")
for i in range(0, len(color_data), 3):
line = ", ".join(color_data[i:i+3])
if i < len(color_data) - 3:
line += ","
f.write(line + "\n")
f.write(");\n")
print(f"数据已导出到: {output_path}")
# 运行导出函数
export_mesh_data()