ฉันจะจัดเรียงตำแหน่งจุดยอดตามลำดับดัชนีในพื้นที่ปิดได้อย่างไร
ฉันต้องการจัดเรียงจุดยอดตามลำดับเพื่อสร้างเอฟเฟกต์วิดีโอนี้ ฉันรู้ว่าฉันควรวาดด้วยมือ แต่บางครั้งเมื่อฉันแบ่งย่อยขอบดัชนีจุดยอดจะเปลี่ยนไป
จุดยอดในภาพด้านล่างถูกต้อง

ตัวอย่างเช่นจุดยอดในภาพด้านล่างจะถูกจัดเรียงแบบสุ่ม เรียงตามลำดับได้ไหม

ฉันพยายามจัดเรียงตามแกน x หรือแกน z แต่มันไม่ได้ผล

โปรดพิจารณาว่าโซลูชันของคุณควรใช้ได้กับรูปทรงที่ซับซ้อน:

คำตอบ
การจัดเรียงดัชนีจุดยอด
ตอบตรงนี้เลย https://blender.stackexchange.com/a/36619/15543 แสดงวิธีการจัดเรียงดัชนีจุดสุดยอดโดยใช้ bmesh
คำตอบที่นี่จะสั่งรายการจุดยอดตามตำแหน่งได้อย่างไร? ไปดูวิธีการเดินขอบสำหรับคำสั่งซื้อ
เพื่อให้แน่ใจว่าจะเดินชิดขอบตามที่แสดงด้านบนจนกว่าจะพบจุดยอดแรกอีกครั้ง (เนื่องจากเป็นแบบวนซ้ำ) และใช้สิ่งนี้สำหรับคำสั่ง จะปล่อยให้คุณปะติดปะต่อบทจากสิ่งที่อยู่ที่นี่
ดังแสดงในคำตอบของ @ Leander
เส้นทางที่สั้นที่สุด
การใช้สคริปต์จากWhat is bmesh เทียบเท่ากับ bpy.ops.mesh.shortest_path_select ()? สามารถเลือก edge เป็นตัวเชื่อมระหว่างจุดแรกและจุดสุดท้ายลบออกชั่วคราวค้นหาเส้นทางที่สั้นที่สุดที่เหลือ (เส้นทางเดียว) จากขอบสองคำกริยา คืนค่าขอบ
เผชิญกับคำสั่งที่คดเคี้ยว
แทนที่จะเป็นวงปิดเช่นด้านบนการโต้แย้งสามารถเติม ngon ใช้คำกริยาใบหน้า ngon เป็นคำสั่ง (ลำดับที่คดเคี้ยว) จัดเรียงคำกริยาใหม่และลบใบหน้า ngon ที่สร้างขึ้น
import bpy
import bmesh
ob = bpy.context.object
assert ob.type == "MESH"
me = ob.data
bm = bmesh.from_edit_mesh(me)
f = bmesh.ops.contextual_create(
bm,
geom=bm.verts[:] + bm.edges[:],
)["faces"][0]
for i, v in enumerate(f.verts):
v.index = i
bm.verts.sort()
bm.faces.remove(f)
bmesh.update_edit_mesh(me)
เลือกจุดแรกและตามเข็มนาฬิกาหรือทวน
ในการเลือก zeroth vert และตรวจสอบการทำดัชนีทวนเข็มนาฬิกา (จากมุมมองด้านบน)
เรียกใช้ในโหมดแก้ไขเลือกจุดยอดที่คุณต้องการให้มีดัชนี 0 สมมติว่ารูปร่างอยู่ในระนาบ XY หากปกติของใบหน้าที่สร้างขึ้นชี้ไปที่ขดลวดจะถูกพลิก

import bpy
import bmesh
from mathutils import Vector
ob = bpy.context.object
assert ob.type == "MESH"
me = ob.data
bm = bmesh.from_edit_mesh(me)
v0 = bm.select_history.active
f = bmesh.ops.contextual_create(
bm,
geom=bm.verts[:] + bm.edges[:],
)["faces"][0]
fverts = f.verts[:]
if f.normal.dot((0, 0, 1)) < 0:
fverts.reverse()
for i, v in enumerate(fverts):
v.index = i
if v is v0:
iv0 = i
for v in fverts:
v.index = (v.index - iv0) % len(fverts)
bm.verts.sort()
bm.faces.remove(f)
bmesh.update_edit_mesh(me)
- เพิ่มคีย์รูปร่าง
- ในคีย์รูปร่างนั้นให้วางจุดยอดซึ่งจะอยู่ห่างจากกันเป็นอันดับแรกและสุดท้ายบนแกน x
- เลือกอื่น ๆ ทั้งหมด (อยู่ระหว่างจุดยอด)
- เลือกW> จุดยอดที่ราบรื่นและตั้งค่าการนับซ้ำที่สูง จุดยอดจะถูกทำให้เรียบ
- จัดเรียงตามแกน x ตาข่าย> จัดเรียงองค์ประกอบ> แกน X
- ลบ shapekey

เมื่อใช้ Python คุณสามารถเดินไปตามขอบและกำหนดดัชนีใหม่ได้
import bpy
import bmesh
me = bpy.context.object.data
bm = bmesh.from_edit_mesh(me)
# index of the start vertex
initial = bm.verts[0]
vert = initial
prev = None
for i in range(len(bm.verts)):
print(vert.index, i)
vert.index = i
next = None
adjacent = []
for v in [e.other_vert(vert) for e in vert.link_edges]:
if (v != prev and v != initial):
next = v
if next == None: break
prev, vert = vert, next
bm.verts.sort()
bmesh.update_edit_mesh(me)
ไม่มีสคริปต์:
- V แยกตาข่ายที่จุดยอดที่คุณต้องการเป็นอันดับแรกหากยังไม่ได้ทำ
- ส่วนหัว> เมนูวัตถุ> แปลงตาข่ายเป็นเส้นโค้ง
- โหมดแก้ไขเมนูคลิกขวาเปลี่ยนทิศทางของ spline หากจำเป็น
- โหมดวัตถุคลิกขวาเมนูแปลงกลับเป็นตาข่าย

ฉันไม่รู้ว่าทำไมConvertถึงไม่อยู่ในเมนูคลิกขวาของโหมด Object สำหรับเมชมันช่างน่ารำคาญ
ยกเว้นการปรับแต่งตามที่ @Seyed จัดทำสคริปต์จะเป็น:
import bpy
bpy.ops.object.convert(target='CURVE', keep_original= False)
bpy.ops.object.convert(target='MESH', keep_original= False)