blender 4.4 Python ã䜿ã£ãŠã¿ãã
blender 㯠python ã€ã³ã¿ããªã¿ãå
èµããŠããã®ã§ãã¢ããªã³ã°ãªã©ã®æäœãã»ãŒãã¹ãŠ python ã«ããã¹ã¯ãªããã§ãå®è¡ããããšãã§ããŸãã
ããã§ã¯ãããã« python ãå«ãããã°ã©ãã³ã°èšèªã®ããåå¿è
ã«åããŠãæäœéã®ç¥èãšããããããªå¿çšäŸã玹ä»ããŸãã
ç°å¢ãBlender 4.4.1 , Mac Mini M1 OS 14.4
ãªã Python ïŒ
blender ã®æäœã ãã§ããã
ãã¶ããããããã®ã«ããã®ããããã°ã©ãã³ã°ãªããŠã ãªã ããšæãããæ¹ãå€ãã ããããããã«ããã°ã©ã ã«ã¯ãããªãã®åŠç¿ã³ã¹ãããããããšã¯æããã ããè¿å¹ŽãAI ã®æ®åã«ãã£ãŠã以åããããããæå³åããç°ãªã£ãŠããŠãããããã°ã©ã ãã®ãã®ã¯ãChatGPT ãªã©ã® AI ã«æžããŠãããã°ããã®ã ã
ãã ããAI ã«æžããŠããã£ãããã°ã©ã ã®å 容ããããŒãããªãããã§ãçè§£ã§ããã ãã®ç¥èã¯ãã¯ãå¿ èŠã§ãããã§ã¯ããã®ããã®ããåºæ¬ç¥èã®ããã€ãã玹ä»ããŠã¿ããã
ãŸãã3D ãªããžã§ã¯ãã®æäœã«ããããžã¥ã¢ã«ãªå¹æãããã«ç¢ºèªã§ãããšããç¹ã§ããããã Python ãåŠç¿ããŠã¿ããããšããããã°ã©ãã³ã°åå¿è ã«ãå®ã¯ blender ã¯æé©ã®ããŒã«ã®ã²ãšã€ã ãšæãããšãããããããè§Šã£ãŠã¿ããã
Scripting
ããã©ã«ãã®ã·ãŒã³ã§ãScripting ã¿ããã¯ãªãã¯ããScripting ã¯ãŒã¯ã¹ããŒã¹ã«åãæ¿ããã

å·ŠåŽã®ãŠã£ã³ããŠã¯ãäžã¯ 3D ãã¥ãŒããŒããPython ã³ã³ãœãŒã«ãæ å ±ãŠã£ã³ã㊠ã§ãå³åŽã¯ããã¹ããšãã£ã¿ãŒã ãåºæ¬çã«ã¯ãããã¹ããšãã£ã¿ãŒã§ããã°ã©ã ãèšè¿°ãããã®å®è¡çµæã 3D ãã¥ãŒããŒã ã§ç¢ºèªããããšããæµãã«ãªãã
åºç€ã ãã§ã Pyhon ã®æŠèŠãçè§£ããŠããããããšããå Žåã¯ãå·Šäžæ®µã® Pyhon ã³ã³ãœãŒã« ã§ãããããªããã°ã©ã ãå®è¡ã§ããã
Pyhonå ¬åŒãã¥ãŒããªã¢ã« - 3. 圢åŒã°ããªã Python ã®ç޹ä»

åºæ¬ã»ããã¢ãã
ããã¹ããšãã£ã¿ãŒã® NewïŒæ°èŠïŒãæŒããããã¹ããäœæ
TextïŒããã¹ãïŒ > SaveïŒä¿åïŒã§ããã¡ã€ã«ãšããŠä¿åãã

ããã¹ããšãã£ã¿ãŒã«ãimport bpy ãšå ¥åãã

bpy 㯠blender ã® Python çšã©ã€ãã©ãªïŒæ¡åŒµæ©èœïŒã®ããšã§ããããã€ã³ããŒãããªããšãblender ã§ã®æäœãè¡ããªãã
3D ãã¥ãŒããŒãã§ãA ããŒãæŒãããªããžã§ã¯ããå šéžæ
X ããŒãæŒãããã¹ãŠãåé€ãã

å·Šäžã®æ å ±ãŠã£ã³ããŠã«ãäžã§è¡ã£ãæäœã®å®è¡æã衚瀺ãããã

ã³ããŒã ãããã¹ããšãã£ã¿ãŒäžãžããŒã¹ããã

3D ãã¥ãŒããŒãã§ãªãããã®æäœãè¡ããšãããã«å¯Ÿå¿ãã Python å®è¡æã衚瀺ããããã³ããã§ããã®ã§äŸ¿å©ã ã
åŸè¿°ã®ããã«ãã¹ã¯ãªããã§ãªããžã§ã¯ããå ããæäœãè¡ããšãæ¢åã®ãªããžã§ã¯ãã®äžã«å ããããã®ã§ãããã§ã¯ããã¥ãŒããŒãäžã®æ¢åã®ãªããžã§ã¯ãããã¹ã¯ãªãããå®è¡ãããã³ã«ãæåã«å šåé€ãããããã«ããŠããã
ããã©ã«ãã®ç«æ¹äœãªããžã§ã¯ãã远å ããåæ§ã«ãå®è¡æãã³ãããã

ã¹ã¯ãªããå šäœã¯ä»¥äžã®ããã«ãªãã
import bpy
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0), scale=(1, 1, 1))ç«æ¹äœãå ããå®è¡æã¯ãå¿ èŠãªæ å ±ã®ã¿ãããã¯ã¢ãããä¿®æ£ããã
å®è¡ãã¿ã³ãæŒããŠãã¹ã¯ãªãããå®è¡

ããšãã°ãäžã®ãbpy.ops.object.delete(âŠ) ã®ãããªå®è¡æã¯ãbbyïŒblenderæ¡åŒµã©ã€ãã©ãªïŒã®ãªãã®ãopsïŒoperationsãæäœïŒãobject ã«ããŽãªã®ãªãã®ãdelete ãšããåœä»€ïŒé¢æ°ïŒãå®è¡ããªããããšããæå³ã«ãªããblender çšã®å®è¡æã¯ã»ãŒãã¹ãŠãã®åœ¢åŒãªã®ã§ãããŒããŠãããã
ãã®ããã«ãPython ã§ã¯ãéåžžãããã¹ããšãã£ã¿ãŒã«åœä»€æãèšè¿°ããããã«å¯Ÿå¿ãã 3D ãã¥ãŒããŒãã§ã®çµæã確èªããããšããæµãã«ãªãããã¡ã€ã«ã«ä¿åããŠããã®ã§ãåŸã«ãã€ã§ãéããŠå®è¡ããããšãã§ããäžã®æäœã ãã§ããäžçš®ã®ãã¯ãã¹ã¯ãªãããšããŠã䜿ããã
Python ã®åºç€
ãã¡ãã Python ãå§ãããã°ã©ãã³ã°èšèªã«ã¯ã倿°ã®æŠå¿µãåœä»€æãããããããã§ã¯ãããã ããæããŠããã°åœåº§ã¯ãªããšããªãããšããã4 ã€ã®åºç€ã倿°ãç¹°ãè¿ããåå²ã颿°ãã玹ä»ããã
Variable - 倿°
倿°ã¯ãæ°å€ãæååãªã©ã®ããŒã¿ãå
¥ããŠããããã®ç®±ã®ãããªååšã§ãäŸå€ã¯ãããããã€ã§ããã®ç®±ã®ãªãã¿ã倿ŽããããåãåºããŠå©çšããããšãã§ããã
v = 5
t = "Hello"v ãšãã倿°ïŒç®±ïŒã«ã5 ãå ¥ããã
t ãšãã倿°ã«ãHelloããšããæååãå ¥ããã
v = 5
v = v + 10äžã®å Žåã1 è¡ç®ã§ã¯ãv ã«ã¯ 5 ãå ¥ãã2 è¡ç®ã§ã¯ã5 + 10 ã® 15 ãå ¥ãã
ã€ã³ãŒã«ãšããããã¯ãv â 5 , v â v + 10 ã®ããã«ãå³ããå·Šãžã®ç¢å°ãèãããšããããããã
äžã®ãmyFirst.py ã®èšè¿°ã以äžã®ããã«å€æŽããŠã¿ãã
import bpy
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0), scale=(1, 1, 1))
a = 4
bpy.ops.mesh.primitive_cube_add(location=(a, 0, 0), scale=(1, 1, 1))
a = a + 4
bpy.ops.mesh.primitive_cube_add(location=(a, 0, 0), scale=(1, 1, 1))2ã3 çªç®ã®ç«æ¹äœè¿œå è¡ã«ã¯ãlocation ã® x 軞ã®å€ã«ã倿° a ãæå®ããŠããããã®ããã2 çªç®ã®ç«æ¹äœã® x äœçœ®ã¯ã4 ãã3 çªç®ã®ç«æ¹äœã® x äœçœ®ã¯ã8 ãé©çšãããã

Loop - ç¹°ãè¿ã
äžã®ããã«ãåãæäœïŒç«æ¹äœã远å ããïŒããäœåãç¹°ãè¿ãããå Žåãfor æã«ããã«ãŒããã¹ããŒããªæ¹æ³ã§ãããã°ã©ãã³ã°èšèªã®åºæ¬ã®ã²ãšã€ã ã
import bpy
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
for i in range(1 , 5):
a = i * 4
bpy.ops.mesh.primitive_cube_add(location=(a, 0, 0), scale=(1, 1, 1))äžã®äŸã§ã¯ãfor(range)æã§ã1 ã 4 ãŸã§ã®ç¹°ãè¿ããè¡ã£ãŠãããç¹°ãè¿ãã®åæ°ã¯ i 倿°ã«å ¥ãã®ã§ã4åã㊠a 倿°ã«å ¥ããç«æ¹äœã® x äœçœ®ã«é©çšããŠãããïŒãªããç¹°ãè¿ãããæã¯ãtab ããŒã§åäžãããïŒ

import bpy
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
for i in range(1 , 5):
a = i * 4
bpy.ops.mesh.primitive_cube_add(location=(a, 0, 0), scale=(1, i, i))
ããã«ãç¹°ãè¿ãã® i ããç«æ¹äœã® scaleïŒã¹ã±ãŒã«ïŒã®ãy ããã³ z ã«é©çš

é åã¢ãã£ãã¡ã€ã¢ã®ãããªæäœã ãããã¡ãããå¿çšç¯å²ã¯åºãã
if - åå²
ããã°ã©ãã³ã°èšèªã®åºæ¬ã®ã²ãšã€ã§ããã ⊠ãªãã°ã⊠ãããªããããšããæäœã«ãªãã
ããšãã°ãäžã®ç¹°ãè¿ãã䜿ã£ãã¹ã¯ãªãã
import bpy
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
for i in range(1 , 10):
bpy.ops.mesh.primitive_cube_add(rotation=(0, 0, 0), location=(0, 0, i), scale=(2, 2, 0.1))
z 軞ã«å¹³ããããç«æ¹äœã äžããäžãžã9 å䞊ã¹ãŠããããªããæ¬¡ã§äœ¿çšããããã«ãç«æ¹äœã®å転ãæå®ãã rotation 屿§ãå ããŠããã

ããšãã°ããããç¹°ãè¿ãã®æ°ã 5 ãã倧ãããªãã°ïŒäžååã®ç«æ¹äœïŒãz è»žã« çŽ 45床ã®å転ãäžãããå Žåã
import bpy
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
for i in range(1 , 10):
r = 0
if i > 5:
r = 0.78
bpy.ops.mesh.primitive_cube_add(rotation=(0, 0, r), location=(0, 0, i), scale=(2, 2, 0.1))åè»¢å€ r ã¯ããã©ã«ãã§ãŒãã ãããã i ã 5 ãã倧ãããªãã°ãr 㯠0.57 ãšããç«æ¹äœã® rotationã® z 軞ã«äžããŠããã

ã¡ãªã¿ã«ãã©ã³ãã ã« 45床以å ã§ãå転ãããã¿ãŒã³ã
import bpy
import random
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
for i in range(1 , 10):
r = random.uniform(0, 0.57)
bpy.ops.mesh.primitive_cube_add(rotation=(0, 0, r), location=(0, 0, i), scale=(2, 2, 0.1))
random 颿°ã䜿çšããã«ã¯ãrandom æ¡åŒµæ©èœã importïŒ2è¡ç®ïŒããã

ããã°ã©ã ã¯ããããããç¹°ãè¿ããšåå²ã§ã§ããŠããããšãã£ãŠãéèšã§ã¯ãªããšæãã
Function - 颿°
颿°ã¯ããªãããã®å€ãäžãããããšã颿°å
ã®æäœã«å¯Ÿå¿ããå€ãåºåããããåŠçãè¡ãæ©èœãã¹ã¯ãªããå
ã§é »åºããåŠçããŸãšããéã«äŸ¿å©ã ã
ããšãã°ãäžã®åŠçã«ããããã«ãPython ã§äœ¿ãããå転ã®åäœã¯ãéåžžã®åºŠïŒdegreeïŒã§ã¯ãªããã©ãžã¢ã³ïŒradianïŒã«ãªãã人éçã«ã¯ããããããã¥ããã®ã§ã床ã«ããå€ããã©ãžã¢ã³ã«å€æãããããããªé¢æ°ãæžããŠã¿ããã
def toRadian(degree):
return degree * ( math.pi / 180)床ãã©ãžã¢ã³ã«å€æããã«ã¯ãdegree x (PI / 180) ãšããåŒãªã®ã§ãäžã®é¢æ° toRadian ã§ã¯ã床ïŒdegreeïŒãäžãããããšãã®åŒã§èšç®ãããã©ãžã¢ã³å€ãè¿ããããšãã°ãtoRadian(90)ãªãã°ã1.5707âŠãšããå€ãåºåãããã
import bpy
import math
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
def toRadian(degree):
return degree * ( math.pi / 180)
for i in range(1 , 19):
bpy.ops.mesh.primitive_cube_add(rotation=(0, 0, toRadian(i * 10)), location=(0, 0, i), scale=(2, 2, 0.1))
ç¹°ãè¿ãã®æ°ïŒ1 ã 18ïŒã«ãã£ãŠããã® 10 åã® 10 ã 180床ã®å転ããtoRadian颿°ã§ã©ãžã¢ã³ã«å€æããŠäžããã

AI ãšã®é£æº
ãã¡ãããããã« Python ãåŠç¿ããŠãããé²ãã blender ã®æäœãè¡ãããšãã§ããããè¿å¹ŽãAI ã®ç»å Žã«ãããChatGPTãªã©ã® AI ãšé£æºããæ¹æ³ãåºãŠããã
ããšãã°ã10 åã®ãªããžã§ã¯ãã«ã©ã³ãã ãªã«ã©ãŒãå²ãåœãŠããå Žåãã·ã§ãŒããŒåŽã§äžã®ããŒããèšå®ããããšã§å®çŸã§ããã


ãŸããåäœã®ãªããžã§ã¯ãã§ãåæ§ã« 10 åã®çã§æ§æãããŠããå Žåãcycles ãªãã°äžã®ã·ã§ãŒããŒããŒãã§ã©ã³ãã ã«ã©ãŒãå®çŸã§ããããEEVEE ã§ã¯å¯Ÿå¿ããŠããªãã


ããã§ãEEVEE ã§ãåæ§ã®æ©èœãå®çŸããããã® python ã¹ã¯ãªãããæžãããããããè·ãéããããChatGPT ã«æžããŠããã£ãã
ãã²ãšã€ã®ãªããžã§ã¯ãå
ã®æ§é çã«åé¢ããããŒãããããã«ã©ã³ãã ãªã«ã©ãŒãå²ãåœãŠãblender ã®ã¹ã¯ãªãããæžããŠãã ããã
ïŒCan you write a script which set different random color to each loose parts in a object of blender?ïŒ
import bpy
import bmesh
import random
import mathutils
# Ensure an object is selected and in object mode
obj = bpy.context.object
if obj is None or obj.type != 'MESH':
raise Exception("Please select a mesh object.")
# Duplicate the original object (optional for safety)
bpy.ops.object.duplicate()
obj = bpy.context.object
obj.name = "ColoredLooseParts"
# Go to edit mode to separate loose parts
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.separate(type='LOOSE')
bpy.ops.object.mode_set(mode='OBJECT')
# Get new separated objects
parts = bpy.context.selected_objects
# Function to create a random material
def create_random_material(name):
mat = bpy.data.materials.new(name=name)
mat.use_nodes = True
bsdf = mat.node_tree.nodes.get("Principled BSDF")
if bsdf:
bsdf.inputs['Base Color'].default_value = [random.random(), random.random(), random.random(), 1]
color_obj = mathutils.Color()
color_obj.hsv = (random.random(), 1, 1)
return mat
# Assign random materials to each loose part
for i, part in enumerate(parts):
mat = create_random_material(f"RandomColor_{i}")
if part.data.materials:
part.data.materials[0] = mat
else:
part.data.materials.append(mat)
# Optional: join all parts back together
bpy.context.view_layer.objects.active = parts[0]
bpy.ops.object.join()
print(f"{len(parts)} loose parts found and colored.")
ãããé·ãããåºæ¬çã«ãããŸã§ã«ç޹ä»ããã倿°ãç¹°ãè¿ããåå²ã颿°ã®ã¿ã§ã§ããŠããããšããããã詳现ã¯ããããããªããšããŠãããããŒãããªãããåè¡ã§ãªã«ãè¡ã£ãŠããã®ãçè§£ã§ããã ããã

ããåè²åœ©ãæ·¡ãã«èšå®ãããã®ã§ãããã³ããã倿Žã
ãã²ãšã€ã®ãªããžã§ã¯ãå
ã®æ§é çã«åé¢ããããŒãããããã«ãHSV ã«ã©ãŒã®ã©ã³ãã ãªè²çžãå²ãåœãŠãblender ã®ã¹ã¯ãªãããæžããŠãã ããã
ïŒCan you write a script which set different random hue of HSV color to each loose parts in a object of blender?ïŒ
import bpy
import bmesh
import random
from mathutils import Color
def assign_random_hue_materials_to_loose_parts(obj):
# Make sure we're in Object mode
if bpy.context.object.mode != 'OBJECT':
bpy.ops.object.mode_set(mode='OBJECT')
# Duplicate object to work on mesh data without affecting original
bpy.ops.object.duplicate()
dup_obj = bpy.context.active_object
bpy.ops.object.convert(target='MESH')
# Enter Edit mode to separate loose parts
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.separate(type='LOOSE')
bpy.ops.object.mode_set(mode='OBJECT')
# Delete the original duplicated object
bpy.data.objects.remove(dup_obj, do_unlink=True)
# Get new objects (the separated parts)
parts = [obj for obj in bpy.context.selected_objects if obj.type == 'MESH']
for part in parts:
# Generate random hue
hue = random.random()
color = Color()
color.hsv = (hue, 1, 1)
# Create a new material
mat = bpy.data.materials.new(name=f"RandomColor_{hue:.2f}")
mat.use_nodes = True
bsdf = mat.node_tree.nodes.get("Principled BSDF")
if bsdf:
bsdf.inputs["Base Color"].default_value = (color.r, color.g, color.b, 1.0)
# Assign the material to the object
if len(part.data.materials) > 0:
part.data.materials[0] = mat
else:
part.data.materials.append(mat)
# Optional: join all parts back together
bpy.context.view_layer.objects.active = parts[0]
bpy.ops.object.join()
# Make sure an object is selected
if bpy.context.object and bpy.context.object.type == 'MESH':
assign_random_hue_materials_to_loose_parts(bpy.context.object)
else:
print("Please select a mesh object.")
çæãããã¹ã¯ãªãããè¥å¹²å€æŽããå®è¡ã

ã²ãšããããŸããªããèªåã§ãã¡ããæžããªããã°ãªããªãã£ãã䟿å©ãªäžã®äžã ã
ãŸãšã
ãã®ããã«ãPython ã«ããæäœã«ãã£ãŠãã¢ãã£ãã¡ã€ã¢ããžãªã¡ããªããŒãã§ã¯å®çŸããã€ãããã¢ããªã³ã°ããããªã¢ã«ã®æäœçãããšãã« AI ãšã®é£æºãå³ãããšã§ãæ¯èŒç容æã«å®çŸã§ããããšãããããŸãã
ããæå³ãAI ã«äžæã«æå³ãäŒããããšã§ãèªåã ãã®ãªãŒããŒã¡ã€ãã®ã¢ããªã³ãæè»œã«äœãããšããããšã«ããªããŸããïŒå®éãé
åžãããŠããã¢ããªã³ã¯ Python ã§äœãããŠããŸãïŒ
ãã ãã®éããPython ã®ããåºæ¬çãªç¥èããããšããããã°ãå¿
èŠãªã«ã¹ã¿ãã€ãºãå¯èœã§ãå¿çšã®å¹
ãåºãããŸããäžçš®ã®ãããŒãšããŠããšãŠããããããããŒã«ã§ãããã²ãã¡ã©ãã©ã€ããŠã¿ãŠãã ãããåèãŸã§ã
äžåŠçã®ãããã¯ãã㊠BASIC ãšããããã°ã©ãã³ã°èšèªãç¿ã£ããšããA = A + 5 ãšããåœä»€æãæåã¯çè§£ã§ããŸããã§ãããããšãã°ãA ã 3 ãªãã°ã3 = 8 ã£ãŠãããããããªããããšã âŠããããŸããæãã°é ãæã®ããšã«ãªããŸããããã®ããã¯ãŸã ãæªæ¥ã¯ SF çã«æããããšä¿¡ããŠãããŸããã
