我尝试将常规网格数据库导入到3D场景中以进行可视化/模拟。要做到这一点,我认为最简单的方法是将常规网格数据库转换为一种格式(例如,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文件格式,那么我就可以编写代码来更新其他材料。
有没有人知道除了使用暴力之外还有别的办法呢?我可以通过暴力的方式来生成一个3D网格,然后遍历常规的网格文件,并检查它是否填充了材质属性,但这仍然不能解决将其转换为wavefront .obj文件格式的问题。我感谢你在这里的忠告。
Sambler提供了一些代码来直接在Blender中生成网格。我无法让这个在搅拌机中运行,所以我修改了它。此代码在blender中运行,并向控制台生成输出。然而,我还没有成功地让它在Blender中产生一个可见的网格。任何帮助都将不胜感激。
import bpy, bmesh
import csv
import os
import glob
import pdb; pdb.set_trace()
from pdb import set_trace as bp
from bpy import context
import csv
import os
import glob
import pdb; pdb.set_trace()
from pdb import set_trace as bp
scale_fac = 0.1
bm = bmesh.new()
filename = 'data.csv'
directory = r'c:\\test\\'
fullpath = os.path.join(directory, filename)
d=[]
with open(fullpath, 'r', newline='') as csvfile:
data = csv.reader(csvfile, delimiter=' ', quoting=csv.QUOTE_NONE)
count=0
for d in data:
#bp()
for elements in d:
parts=elements.split(',')
if count==0:
grid_x = int(parts[0].strip(""))
print(grid_x)
grid_y = int(parts[1])
print(grid_y)
grid_z = int(parts[2])
print(grid_z)
count+=1
#print(count)
else:
x = int(parts[0])
y = int(parts[1])
z = int(parts[2])
print(x,y,z)
continue
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(parts[3])
print(f.material_index)
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()
print("Mesh Complete")发布于 2018-01-07 16:36:45
您可以读取数据并直接在blender中生成网格,而无需手动创建.obj文件。然后,如果要将网格转移到其他位置,则可以将其导出为.obj。
在性能方面,blender使用一个具有一百万个顶点的对象比使用一千个对象每个一千个顶点工作得更好,所以我建议将网格构建为一个对象。查看this answer了解我不久前执行的一个测试。如果你想要多个对象,当你想要多个对象时,用松散的部分来分离是很简单的,虽然很耗时。
可以为对象中的每个断开连接的网格片(或每个面)指定不同的材质。请注意,此处指定的材质索引是指定给对象的材质的索引,这些材质可以在obj.material_slots中找到。有关同时创建BI材质的简单示例,请参见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()https://stackoverflow.com/questions/48133762
复制相似问题