การเพิ่ม Hook ให้กับ Nurbs Path ด้วย Python
การเขียนสคริปต์ Python
ฉันต้องการเพิ่มเบ็ดให้กับเส้นทาง Nurbs ขณะเขียนสคริปต์
ในเค้าโครง:
ลบ 'Cube' เพิ่ม Curve -> เปลี่ยนเส้นทางเป็นโหมดแก้ไขเลือก Vertex ctrl + h
ทั้งหมดตั้งค่าและเสร็จสิ้น
การเขียนสคริปต์:
# Add Path
coords_list = ([[0,0,0], [1,0,0]])
path = bpy.data.curves.new('_path', 'CURVE')
path.dimensions = "3D"
spline = path.splines.new(type='POLY')
spline.points.add(len(coords_list)-1)
for p, new_co in zip(spline.points, coords_list):
p.co = (new_co + [1.0]) # (add nurbs weight)
Path = bpy.data.objects.new('_Path', path)
bpy.context.scene.collection.objects.link(Path)
การตั้งค่า bpy.data.objects ['_ Path']. modifers [".... ID .... "]. vertex_indices [0] เป็นแบบอ่านอย่างเดียว
การพยายามเพิ่ม vertex_groups ใน Path จะส่งกลับ 'None Type'
ความคิดใด ๆ ?
THX มาร์ติน
คำตอบ
หลีกเลี่ยงโหมดแก้ไขหากทำได้
แนะนำให้ทำผ่านการเรียก API โดยไม่ต้องใช้โอเปอเรเตอร์ ให้ความเกียจคร้านเพิ่มช่องว่างด้วย op ให้เพิ่มเมื่อคุณมีวัตถุอื่น ๆ หากต้องการ
สคริปต์ทดสอบเพิ่มตะขอว่างที่ปลายแต่ละด้านของโพลีของคุณ หมายเหตุได้ใช้ NURBS ตามชื่อคำถาม เพื่อให้จุดสิ้นสุดตั้งค่าuse_endpoints_uและvคุณสมบัติของ spline
import bpy
from bpy import context
# Add Path
coords_list = ([[0,0,0], [1,0,0]])
path = bpy.data.curves.new('_path', 'CURVE')
path.dimensions = "3D"
spline = path.splines.new(type='NURBS')
spline.points.add(len(coords_list)-1)
spline.use_endpoint_u = True
spline.use_endpoint_v = True
path_ob = bpy.data.objects.new('_Path', path)
for i, (p, new_co) in enumerate(
zip(spline.points, coords_list)
):
p.co = (new_co + [1.0]) # (add nurbs weight)
bpy.ops.object.empty_add(
location=new_co,
)
hm = path_ob.modifiers.new(
name=f"Hook{i}",
type='HOOK',
)
hm.object = context.object
hm.vertex_indices_set([i])
context.collection.objects.link(path_ob)
หลังจากมะนาวแจ้งให้ฉันตอบตัวเอง:
วิธีแฮ็คที่ฉันใช้การใช้ python เพื่อสร้างเส้นโค้งและแนบจุดสิ้นสุดด้วยตะขอกับสองทรงกลมที่ Mutant Bob กำลังโพสต์ใหม่http://web.purplefrog.com/~thoth/blender/python-cookbook/hook-modifier-curve.html แนวคิดเบื้องหลังการแฮ็กนี้ดูเหมือนจะเปลี่ยนเป็นโหมดแก้ไข
ตั้งค่า P0.select = True และใช้
bpy.ops.object.hook_assign (modifier = ... ) เพื่อตั้งค่า vertex_indices
นี่คือปี 2014 ใน Blender 2.83
ตัวดำเนินการ hook_assign ตัวแรกอย่างใด (อย่าถามฉัน - เป็นการสังเกต) บล็อก P0.select = False
ดังนั้น:
หลังจากเปลี่ยนเป็นโหมดวัตถุ -> เลือกสิ่งที่นั่น -> เลือกเส้นทางอีกครั้ง -> เปลี่ยนเป็นโหมดแก้ไขอีกครั้ง -> ตั้งค่า P0.select = False -> ตั้งค่า P1.select = True -> เรียกตัวดำเนินการเพื่อกำหนด hook - > เปลี่ยนกลับเป็น Object Mode
ช่างเป็นความอัปยศอดสูที่ใช้เวลาหลายชั่วโมงในการคิดสิ่งนี้