Skip to content

【在线Shader测试】

uv与采样纹理

测试3d模型

测试3d模型UV

测试3d模型法线

以下是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()

MIT Licensed