首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bpy呈现顶点颜色或将顶点颜色转换为纹理的对象

使用bpy呈现顶点颜色或将顶点颜色转换为纹理的对象
EN

Stack Overflow用户
提问于 2021-07-15 10:40:00
回答 2查看 746关注 0票数 1

我试图使用bpy (.obj )(version 2.93.1)呈现一个对象( .ply和version 2.93.1都不起作用),但是它们是灰色的(没有颜色),尽管它们有顶点颜色。

对象在网格中的样子

代码语言:javascript
复制
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)

在应用这个代码之后,我得到了一个像这样的灰色玻璃:灰玻璃

然后,我找到了如何解决这个问题,最后的代码如下所示:

代码语言:javascript
复制
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)

但它显示了一个错误:

代码语言:javascript
复制
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

执行代码后,玻璃被着色(结果图像)。但我不知道如何从上一段中自动处理过程。

另外,我想把顶点颜色转换成纹理可能会解决这个问题,但是我没有找到如何使用python来实现这个问题。

如果有人能在这个问题上帮助我,我将非常感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-20 14:20:38

我找到解决办法了!如果你粘贴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']

票数 2
EN

Stack Overflow用户

发布于 2021-07-18 12:24:13

我找到解决办法了!如果你粘贴

代码语言:javascript
复制
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语句之前,一切都将正常工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68392304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档