使用 bpy 渲染具有顶点颜色的对象或将顶点颜色转换为纹理
Render object with vertex color using bpy or convert vertex color to texture
我尝试使用 bpy(version 2.93.1
) 渲染一个对象(.obj 和 .ply - 两者都不起作用),但是它们是灰色的(没有颜色),尽管它们有顶点颜色。
how object looks like in meshlab
import bpy
import os
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete()
file_loc = '../from-obj-to-photos/objects/glass.ply'
# imported_object = bpy.ops.import_scene.obj(filepath=file_loc, split_mode="OFF")
bpy.ops.import_mesh.ply(filepath=file_loc)
obj_object = bpy.context.selected_objects[0]
print('Imported name:', obj_object.name)
bpy.context.scene.render.filepath = '~/Desktop/photos/img.jpg'
bpy.context.scene.render.engine = 'CYCLES'
bpy.ops.render.render('INVOKE_DEFAULT', write_still=True)
应用此代码后,我得到了这样的灰色玻璃:grey glass
然后我找到了解决这个问题的方法,我的最终代码如下所示:
import bpy
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete()
file_loc = '../from-obj-to-photos/objects/glass.ply'
# imported_object = bpy.ops.import_scene.obj(filepath=file_loc, split_mode="OFF")
bpy.ops.import_mesh.ply(filepath=file_loc)
obj_object = bpy.context.selected_objects[0]
print('Imported name:', obj_object.name)
bpy.data.objects["glass"].select_set(True)
bpy.ops.paint.vertex_paint_toggle()
#bpy.context.area.ui_type = 'ShaderNodeTree'
#bpy.ops.material.new()
mat = bpy.data.materials.get("Material")
if mat:
mat.node_tree.nodes.new("ShaderNodeVertexColor")
mat.node_tree.links.new(mat.node_tree.nodes[2].outputs['Color'], mat.node_tree.nodes[1].inputs['Base Color'])
bpy.context.scene.render.filepath = '~/Desktop/photos/img.jpg'
bpy.context.scene.render.engine = 'CYCLES'
bpy.ops.render.render('INVOKE_DEFAULT', write_still=True)
但是显示错误:
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
KeyError: 'bpy_prop_collection[key]: key "Base Color" not found'
要修复它,我必须打开着色器编辑器,点击按钮 browse material to be linked
并选择 Material
。
执行代码后,玻璃被着色 (result image)。但是我不知道如何使上一段中的流程自动化。
此外,我想将顶点颜色转换为纹理可能会解决这个问题,但我没有找到任何地方如何使用 python。
如果有人能帮助我解决这个问题,我将不胜感激。
我找到了解决办法!如果你粘贴
if len(bpy.context.active_object.data.materials) == 0:
bpy.context.active_object.data.materials.append(bpy.data.materials['Material'])
else:
bpy.context.active_object.data.materials[0] = bpy.data.materials['Material']
在 if 语句 之前,一切都会正常工作
我找到了解决办法!如果你粘贴if len(bpy.context.active_object.data.materials) == 0: bpy.context.active_object.data.materials.append(bpy.data.materials['Material']) else: bpy.context.active_object.data.materials[0] = bpy.data.materials['Material']
我尝试使用 bpy(version 2.93.1
) 渲染一个对象(.obj 和 .ply - 两者都不起作用),但是它们是灰色的(没有颜色),尽管它们有顶点颜色。
how object looks like in meshlab
import bpy
import os
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete()
file_loc = '../from-obj-to-photos/objects/glass.ply'
# imported_object = bpy.ops.import_scene.obj(filepath=file_loc, split_mode="OFF")
bpy.ops.import_mesh.ply(filepath=file_loc)
obj_object = bpy.context.selected_objects[0]
print('Imported name:', obj_object.name)
bpy.context.scene.render.filepath = '~/Desktop/photos/img.jpg'
bpy.context.scene.render.engine = 'CYCLES'
bpy.ops.render.render('INVOKE_DEFAULT', write_still=True)
应用此代码后,我得到了这样的灰色玻璃:grey glass
然后我找到了解决这个问题的方法,我的最终代码如下所示:
import bpy
bpy.ops.object.select_by_type(type='MESH')
bpy.ops.object.delete()
file_loc = '../from-obj-to-photos/objects/glass.ply'
# imported_object = bpy.ops.import_scene.obj(filepath=file_loc, split_mode="OFF")
bpy.ops.import_mesh.ply(filepath=file_loc)
obj_object = bpy.context.selected_objects[0]
print('Imported name:', obj_object.name)
bpy.data.objects["glass"].select_set(True)
bpy.ops.paint.vertex_paint_toggle()
#bpy.context.area.ui_type = 'ShaderNodeTree'
#bpy.ops.material.new()
mat = bpy.data.materials.get("Material")
if mat:
mat.node_tree.nodes.new("ShaderNodeVertexColor")
mat.node_tree.links.new(mat.node_tree.nodes[2].outputs['Color'], mat.node_tree.nodes[1].inputs['Base Color'])
bpy.context.scene.render.filepath = '~/Desktop/photos/img.jpg'
bpy.context.scene.render.engine = 'CYCLES'
bpy.ops.render.render('INVOKE_DEFAULT', write_still=True)
但是显示错误:
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
KeyError: 'bpy_prop_collection[key]: key "Base Color" not found'
要修复它,我必须打开着色器编辑器,点击按钮 browse material to be linked
并选择 Material
。
执行代码后,玻璃被着色 (result image)。但是我不知道如何使上一段中的流程自动化。
此外,我想将顶点颜色转换为纹理可能会解决这个问题,但我没有找到任何地方如何使用 python。
如果有人能帮助我解决这个问题,我将不胜感激。
我找到了解决办法!如果你粘贴
if len(bpy.context.active_object.data.materials) == 0:
bpy.context.active_object.data.materials.append(bpy.data.materials['Material'])
else:
bpy.context.active_object.data.materials[0] = bpy.data.materials['Material']
在 if 语句 之前,一切都会正常工作
我找到了解决办法!如果你粘贴if len(bpy.context.active_object.data.materials) == 0: bpy.context.active_object.data.materials.append(bpy.data.materials['Material']) else: bpy.context.active_object.data.materials[0] = bpy.data.materials['Material']