微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 bpy 渲染具有顶点颜色的对象或将顶点颜色转换为纹理

如何解决使用 bpy 渲染具有顶点颜色的对象或将顶点颜色转换为纹理

我尝试使用 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,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']

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。