从常规网格数据库创建wavefront.obj文件

2024-05-16 09:23:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图导入一个常规的网格数据库到三维场景中进行可视化/模拟。我认为最简单的方法是将常规网格数据库转换成一种格式(例如wavefront.obj),可以导入Blender。常规网格数据库的格式如下: 例如,第一行有三个整数 3072 3072 10 第一行有三个整数,表示网格的维数。在上面的示例中,网格是3072 x 3072 x 10个框。假设1米体素立方体

文件的提醒有六列

3072 3072 10
1437    1437    1   500 314.781433  4.82E-05
1437    1438    1   500 314.781433  4.82E-05
1437    1439    1   500 314.781433  4.82E-05
1437    1440    1   500 314.781433  4.82E-05
1437    1441    1   500 314.781433  4.82E-05
1437    1442    1   500 314.781433  4.82E-05
1437    1443    1   500 314.781433  4.82E-05
1437    1444    1   500 314.781433  4.82E-05 ....

在哪里 文件的其余部分由包含六列数据的行组成。前三列表示体素索引(从0开始计数)。第四列表示与单独的材料数据库文件(.mat)中的条目相对应的材料ID。第五列用开尔文表示温度。最后一列表示浓度,单位为百万分之几(ppm)。在

为了简化问题,假设我们有一个单一的材质(材质ID 500)。如果我可以把它转换成.obj文件格式,那么我就可以编写一个代码来更新其他材料。在

有没有人知道用暴力以外的方法?我可以用蛮力生成一个三维网格,然后逐步通过常规网格文件,检查它是否填充了材质属性,但这仍然不能解决将其转换为wavefront.obj文件格式的问题。我很感激你的忠告。在

Sambler提供了一些代码来直接在Blender中生成网格。我不能让这个运行在搅拌机,所以我修改了它。此代码在blender中运行,并向控制台生成输出。然而,我并没有成功地让它产生一个可见的网格搅拌机。任何帮助都将不胜感激。在

^{pr2}$

Tags: 文件方法代码id数据库obj网格格式
1条回答
网友
1楼 · 发布于 2024-05-16 09:23:54

不用手动创建.obj文件,您可以直接在blender中读取数据并生成网格。如果要将网格传输到其他位置,则可以将其导出为.obj。

性能方面,blender对一个有一百万个顶点的对象比一千个每个一千个顶点的对象更好,所以我建议将网格作为一个对象来构建。请参阅this answer查看我不久前执行的一个测试。如果您想要多个对象,那么在完成时用松散的部分将其分开是很简单的,尽管很耗时。

可以为对象中的每个断开的网格块(或每个面)指定不同的材质。注意,这里指定的材质索引是指定给对象的材质的索引,可以在^{}中找到。请参见this answer以获取创建双材料的简单示例。

import bpy, bmesh
import csv

scale_fac = 0.1

bm = bmesh.new()
grid_x , grid_y, grid_z = (0,0,0) # grid limits
with open('data.csv') as csvfile:
    data = csv.reader(csvfile, delimiter=' ', quoting=csv.QUOTE_NONE)
    for d in data:
        if len(d) == 3:
            grid_x = int(d[0])
            grid_y = int(d[1])
            grid_z = int(d[2])
            continue
        x = int(d[0])
        y = int(d[1])
        z = int(d[2])
        res = bmesh.ops.create_cube(bm,size=scale_fac)
        bmesh.ops.translate(bm, verts=res['verts'],
                vec=(x*scale_fac , y*scale_fac, z*scale_fac))
        for v in res['verts']:
            for f in v.link_faces:
                f.material_index = int(d[3])

obj_data = bpy.data.meshes.new('gridmesh')
gridobj = bpy.data.objects.new('gridobj', obj_data)
bpy.context.scene.objects.link(gridobj)
bm.to_mesh(gridobj.data)
bm.free()

相关问题 更多 >