Panggang peta tekstur dengan python

Aug 15 2020

Saya menggunakan Blender 2.83. Untuk addon (dapat diakses dari 3D-View) saya ingin membuat peta tekstur. Saya bisa melakukannya dengan sempurna tanpa skrip. Tetapi dengan python saya tidak berhasil sejauh ini.

Untuk mengurangi masalah saya ke minumum paling sederhana, saya mulai dengan objek yang dipilih dengan UV yang valid. Saya kemudian menjalankan skrip python berikut:

import bpy

obj = bpy.context.active_object

# Creating a texture node, linked with a new image
mat = obj.data.materials[0]
mat.use_nodes = True
texImage = mat.node_tree.nodes.new('ShaderNodeTexImage')
img = bpy.ops.image.new(name= obj.name + '_BakedTexture')
texImage = img

# !!! No image is linked to the texture node !!!

# Baking to the newly created image
# The following part works if I create the texture node and the assigning of the image by hand
bpy.context.view_layer.objects.active = obj
bpy.ops.object.bake(type='DIFFUSE', save_mode='EXTERNAL', filepath='C:\\TEMP\\baked.png', use_automatic_name=True, width=512, height=512)

Saya pikir apa yang saya lewatkan adalah penautan yang benar dari gambar ke node tekstur. Saya berkonsultasi dengan pertanyaan serupa seperti

Atur simpul gambar aktif dengan python

tetapi jawaban mereka tidak membantu (kode untuk Blender 2.7 yang tidak kompatibel lagi, saya kira).

Jawaban

3 NoobCat Aug 22 2020 at 01:23

Saya rasa saya akan memberi Anda beberapa langkah dasar, yaitu menambahkan node jenis "TEX_IMAGE", menetapkan gambar Anda ke sana. karena itu:

obj = bpy.context.active_object
# You can choose your texture size (This will be the de bake image)
image_name = obj.name + '_BakedTexture'
img = bpy.data.images.new(image_name,1024,1024)

   
#Due to the presence of any multiple materials, it seems necessary to iterate on all the materials, and assign them a node + the image to bake.
for mat in obj.data.materials:

    mat.use_nodes = True #Here it is assumed that the materials have been created with nodes, otherwise it would not be possible to assign a node for the Bake, so this step is a bit useless
    nodes = mat.node_tree.nodes
    texture_node =nodes.new('ShaderNodeTexImage')
    texture_node.name = 'Bake_node'
    texture_node.select = True
    nodes.active = texture_node
    texture_node.image = img #Assign the image to the node
    
bpy.context.view_layer.objects.active = obj
bpy.ops.object.bake(type='DIFFUSE', save_mode='EXTERNAL')

img.save_render(filepath='C:\\TEMP\\baked.png')
    
#In the last step, we are going to delete the nodes we created earlier
for mat in obj.data.materials:
    for n in mat.node_tree.nodes:
        if n.name == 'Bake_node':
            mat.node_tree.nodes.remove(n)

Hindari sebisa mungkin menggunakan bpy.ops, dalam hal ini, seperti yang Anda lihat, mudah untuk membuat gambar dengan metode bpy.data.images.new () Objek blender apa pun dapat dibuat dengan metode itu.

bpy.data.objects.new()
bpy.data.materials.new()
bpy.data.scenes.new()
...
...

bpy.ops sebaiknya digunakan hanya jika Anda tidak memiliki alternatif, seperti dalam kasus ini dengan file bpy.ops.object.bake()

ini memungkinkan Anda untuk membuat sesuatu, dan menugaskannya langsung ke variabel, seperti dalam contoh img = bpy.data.images.new()Jadi Anda tidak perlu gila-gilaan untuk memiliki akses ke sana.