อบแผนที่พื้นผิวด้วย python
ฉันใช้ Blender 2.83 สำหรับ addon (เข้าถึงได้จากมุมมอง 3 มิติ) ฉันต้องการอบแผนที่พื้นผิว ฉันสามารถทำได้อย่างสมบูรณ์แบบโดยไม่ต้องเขียนสคริปต์ แต่กับหลามฉันไม่ได้โซฟาที่ประสบความสำเร็จ
เพื่อลดปัญหาของฉันให้เหลือน้อยที่สุดฉันเริ่มต้นด้วยวัตถุที่เลือกด้วย UV ที่ถูกต้อง ฉันเรียกใช้สคริปต์ python ต่อไปนี้:
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)
ฉันคิดว่าสิ่งที่ฉันขาดหายไปคือการเชื่อมโยงรูปภาพกับโหนดพื้นผิวที่ถูกต้อง ฉันปรึกษาคำถามที่คล้ายกันเช่น
ตั้งค่าโหนดรูปภาพที่ใช้งานอยู่ด้วย python
แต่คำตอบของพวกเขาไม่ได้ช่วยอะไร (รหัสสำหรับ Blender 2.7 ที่เข้ากันไม่ได้อีกต่อไปฉันเดา)
คำตอบ
ฉันคิดว่าฉันจะให้ขั้นตอนพื้นฐานแก่คุณนั่นคือเพิ่มโหนดประเภท "TEX_IMAGE" กำหนดภาพของคุณให้ ดังนั้น:
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 ให้มากที่สุดเท่าที่จะทำได้ในกรณีนี้อย่างที่คุณเห็นมันเป็นเรื่องง่ายที่จะสร้างภาพด้วยเมธอด bpy.data.images.new () สามารถสร้างวัตถุเครื่องปั่นใด ๆ ด้วยวิธีการนั้นได้
bpy.data.objects.new()
bpy.data.materials.new()
bpy.data.scenes.new()
...
...
bpy.ops เป็นการดีที่จะใช้เฉพาะเมื่อคุณไม่มีทางเลือกอื่นเช่นในกรณีนี้กับไฟล์ bpy.ops.object.bake()
สิ่งนี้ช่วยให้คุณสามารถสร้างบางสิ่งและกำหนดให้กับตัวแปรได้โดยตรงดังตัวอย่างของimg = bpy.data.images.new()
ดังนั้นคุณไม่จำเป็นต้องบ้าคลั่งเพื่อเข้าถึงมัน