การเพิ่ม Hook ให้กับ Nurbs Path ด้วย Python

Sep 13 2020

การเขียนสคริปต์ 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 มาร์ติน

คำตอบ

2 batFINGER Oct 15 2020 at 12:04

หลีกเลี่ยงโหมดแก้ไขหากทำได้

แนะนำให้ทำผ่านการเรียก 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)
1 martburg Sep 13 2020 at 19:08

หลังจากมะนาวแจ้งให้ฉันตอบตัวเอง:

วิธีแฮ็คที่ฉันใช้การใช้ 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

ช่างเป็นความอัปยศอดสูที่ใช้เวลาหลายชั่วโมงในการคิดสิ่งนี้