在blender3.5中从二进制文件加载原生数据生成mesh对象并渲染出图的源码

不多言,上代码:

import bpy
import bmesh
import struct


def toTuplesByStepN(datals, stepN = 4):
    ds = tuple(datals)
    rds = tuple(ds[i:i + stepN] for i in range(0, len(ds), stepN))
    return rds

def toFloat32List(dataStr):
    bytesTotal = len(dataStr)
    print("bytesTotal: ", bytesTotal)
    # 下面的双斜线是除法结果为整数
    segLen = bytesTotal//4
    # 注意字节序
    data = struct.unpack(segLen*'f',dataStr)
    return data
###
def toUint16List(dataStr):
    bytesTotal = len(dataStr)
    print("bytesTotal: ", bytesTotal)
    # 下面的双斜线是除法结果为整数
    segLen = bytesTotal//2
    print("segLen: ", segLen)
    # 注意字节序
    data = struct.unpack(segLen*'H',dataStr)
    return data
###
def toUint32List(dataStr):
    bytesTotal = len(dataStr)
    print("bytesTotal: ", bytesTotal)
    # 下面的双斜线是除法结果为整数
    segLen = bytesTotal//4
    # 注意字节序
    data = struct.unpack(segLen*'I',dataStr)
    return data


def clearAllMeshesInScene():
    bpy.ops.object.select_all(action='DESELECT')
    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    #
def clearRawIScene():    
    obj = bpy.data.objects["Cube"]
    if obj:
        bpy.data.objects.remove(obj)
    else:
        print("has not the default Cube object in the current scene.")
clearAllMeshesInScene()
################################
rootDir = "D:/dev/bpydev/"
#rootDir = "D:/dev/webdev/"

file_vs = open(rootDir + 'voxtool/models/verticesBox.bin','rb')
dataStr_vs = file_vs.read()
vertices = list(toTuplesByStepN(toFloat32List(dataStr_vs), 3))
print("vertices:\n", vertices)

file_ivs = open(rootDir + 'voxtool/models/indicesBox.bin','rb')
dataStr_ivs = file_ivs.read()
faces = list(toTuplesByStepN(toUint16List(dataStr_ivs), 3))
print("faces:\n", faces)

file_uvs = open(rootDir + 'voxtool/models/uvBox.bin','rb')
dataStr_uvs = file_uvs.read()
uv_coords = list(toTuplesByStepN(toFloat32List(dataStr_uvs), 2))
print("uv_coords:\n", uv_coords)

file_nvs = open(rootDir + 'voxtool/models/normalBox.bin','rb')
dataStr_nvs = file_nvs.read()
normals = list(toTuplesByStepN(toFloat32List(dataStr_nvs), 3))
print("normals:\n", normals)

# 创建mesh和物体
mesh = bpy.data.meshes.new("Cube")
robjEntity = bpy.data.objects.new("Cube", mesh)

# 将物体添加到场景
scene = bpy.context.scene
scene.collection.objects.link(robjEntity)

# 创建bmesh对象
bm = bmesh.new()
bm.from_mesh(mesh)

# 添加顶点
# print("vertices: ", vertices)
for v in vertices:
    # print("v: ", v)
    bm.verts.new(v)

bm.verts.ensure_lookup_table()
print("len(faces): ", len(faces))
# 添加面
for k in range(0, len(faces)):
    bm.faces.new([bm.verts[i] for i in faces[k]])

# 添加法线
for vert, normal in zip(bm.verts, normals):
    vert.normal = normal

# 添加UV坐标
uv_layer = bm.loops.layers.uv.verify()
for f, uv in zip(bm.faces, uv_coords):
    for loop in f.loops:
        loop[uv_layer].uv = uv

# 更新mesh数据
bm.to_mesh(mesh)
bm.free()

# 更新mesh的法线
mesh.calc_normals()

robjEntity.scale = (0.1,0.1, 0.1)

vertex_normals = robjEntity.data.vertex_normals
# 遍历每个顶点和其法线
for i, vertex in enumerate(robjEntity.data.vertices):
    normal = vertex_normals[i]
    print("vtx normal: ", normal.vector)
################################################################
print("build proc end ...")
print("ready to rendering ...")
renderer = bpy.context.scene.render
renderer.image_settings.file_format='PNG'
renderer.filepath = rootDir + "voxtool/renderingImg/rawDataMesh.png"
renderer.resolution_x = 512
renderer.resolution_y = 512
bpy.ops.render.render(write_still=True)
print("rendering proc end ...")

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值