ฉันจะจัดเรียงตำแหน่งจุดยอดตามลำดับดัชนีในพื้นที่ปิดได้อย่างไร

Aug 20 2020

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

จุดยอดในภาพด้านล่างถูกต้อง

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

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

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

คำตอบ

11 batFINGER Aug 20 2020 at 15:08

การจัดเรียงดัชนีจุดยอด

ตอบตรงนี้เลย 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 หากปกติของใบหน้าที่สร้างขึ้นชี้ไปที่ขดลวดจะถูกพลิก

ลำดับแบบสุ่ม vert 22 ที่เลือกสคริปต์ด้านล่างทำงาน

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) 
6 Leander Aug 20 2020 at 14:33
  1. เพิ่มคีย์รูปร่าง
  2. ในคีย์รูปร่างนั้นให้วางจุดยอดซึ่งจะอยู่ห่างจากกันเป็นอันดับแรกและสุดท้ายบนแกน x
  3. เลือกอื่น ๆ ทั้งหมด (อยู่ระหว่างจุดยอด)
  4. เลือกW> จุดยอดที่ราบรื่นและตั้งค่าการนับซ้ำที่สูง จุดยอดจะถูกทำให้เรียบ
  5. จัดเรียงตามแกน x ตาข่าย> จัดเรียงองค์ประกอบ> แกน X
  6. ลบ shapekey

4 Leander Aug 20 2020 at 18:58

เมื่อใช้ 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)
2 RobinBetts Aug 21 2020 at 15:45

ไม่มีสคริปต์:

  1. V แยกตาข่ายที่จุดยอดที่คุณต้องการเป็นอันดับแรกหากยังไม่ได้ทำ
  2. ส่วนหัว> เมนูวัตถุ> แปลงตาข่ายเป็นเส้นโค้ง
  3. โหมดแก้ไขเมนูคลิกขวาเปลี่ยนทิศทางของ spline หากจำเป็น
  4. โหมดวัตถุคลิกขวาเมนูแปลงกลับเป็นตาข่าย

ฉันไม่รู้ว่าทำไมConvertถึงไม่อยู่ในเมนูคลิกขวาของโหมด Object สำหรับเมชมันช่างน่ารำคาญ

ยกเว้นการปรับแต่งตามที่ @Seyed จัดทำสคริปต์จะเป็น:

import bpy
bpy.ops.object.convert(target='CURVE', keep_original= False)
bpy.ops.object.convert(target='MESH', keep_original= False)