Python ile doku haritası hazırlayın
Blender 2.83 kullanıyorum. Bir eklenti için (3B Görünümden erişilebilir), doku haritaları pişirmek istiyorum. Bunu komut dosyası yazmadan mükemmel bir şekilde yapabiliyorum. Ama python ile şimdiye kadar başarılı olamadım.
Sorunumu en küçük boyuta indirmek için geçerli UV'ye sahip seçili bir nesne ile başlıyorum. Daha sonra aşağıdaki python betiğini çalıştırıyorum:
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)
Bence eksik olan şey görüntünün doku düğümüne doğru şekilde bağlanması. Şunun gibi benzer sorulara danıştım
Python ile aktif görüntü düğümünü ayarla
ancak cevapları yardımcı olmadı (artık uyumlu olmayan Blender 2.7 için kod sanırım).
Yanıtlar
Sanırım size bazı temel adımlar vereceğim, yani "TEX_IMAGE" türünde bir düğüm ekleyin, resminizi ona atayın. bu nedenle:
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)
Bpy.ops'u kullanmaktan mümkün olduğunca kaçının, bu durumda gördüğünüz gibi, bpy.data.images.new () yöntemleriyle bir görüntü oluşturmak kolaydır. Bu yöntemle herhangi bir blender nesnesi oluşturulabilir.
bpy.data.objects.new()
bpy.data.materials.new()
bpy.data.scenes.new()
...
...
bpy.ops, bu durumda olduğu gibi, yalnızca alternatifiniz olmadığında kullanmak iyidir. bpy.ops.object.bake()
bu, bir şey oluşturmanıza ve örneğinde olduğu gibi onu doğrudan bir değişkene atamanıza izin verir. img = bpy.data.images.new()
Yani ona erişmek için delirmek zorunda değilsiniz.