닫힌 영역에서 인덱스를 순차적으로 정렬하려면 어떻게해야합니까?
이 비디오 와 같은 효과를 내려면 정점을 순차적으로 정렬해야합니다 . 나는 그것들을 손으로 그려야한다는 것을 알고 있지만 때로는 가장자리를 세분화하면 정점 인덱스가 변경됩니다.
아래 이미지의 정점은 정확합니다.

예를 들어 아래 이미지의 정점은 무작위로 정렬됩니다. 순차적으로 정렬 할 수 있습니까?

x 축 또는 z 축을 따라 정렬하려고했지만 작동하지 않았습니다.

솔루션이 복잡한 모양에 대해 작동해야합니다.

답변
정점 인덱스 정렬.
여기에 답변 https://blender.stackexchange.com/a/36619/15543 bmesh를 사용하여 정점 인덱스를 정렬하는 방법을 보여줍니다.
여기 답변 은 어떻게 위치를 기반으로 정점의 목록을 주문하려면? 주문을 위해 가장자리를 걷는 방법을 보여줍니다.
확실하게 확인하려면 첫 번째 vert가 다시 만날 때까지 (루프이기 때문에) 위에 표시된대로 가장자리를 걷고이를 주문에 사용합니다. 여기에있는 스크립트를 모으는 것은 당신에게 맡길 것입니다.
@Leander의 답변에서 입증 된 바와 같이
최단 경로
bpy.ops.mesh.shortest_path_select ()에 해당하는 bmesh는 무엇입니까? 의 스크립트 사용 첫 번째와 마지막 인덱스 vert 사이의 링크로 가장자리를 선택하고, 일시적으로 제거하고, 두 vert 가장자리에서 가장 짧은 남은 경로 (유일한 경로)를 찾을 수 있습니다. 가장자리를 회복하십시오.
얼굴 감기 순서
위와 같은 폐쇄 루프 대신, 경쟁은 ngon으로 채울 수 있으며 ngon face verts를 순서로 사용 (감기 순서) verts를 다시 정렬하고 생성 된 ngon face를 제거합니다.
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)
첫 번째 vert를 선택하고 시계 방향 또는 카운터
0 번째 vert를 선택하고 시계 반대 방향 (상단 뷰에서) 인덱싱을 보장하려면
편집 모드에서 실행하고 인덱스 0을 가지려는 vert를 선택합니다. 모양이 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)
- shapekey를 추가하십시오.
- 그 shapekey에서, 처음과 마지막이 될 정점을 x 축에서 서로 멀리 떨어져 배치합니다.
- 다른 모든 항목 (정점 사이)을 선택합니다.
- W> Smooth Vertices를 선택 하고 높은 반복 횟수를 설정합니다. 정점이 부드럽게됩니다.
- 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 메시를 먼저 분할하려는 정점에서 분할합니다.
- 머리글> 개체 메뉴> 메시를 곡선으로 변환
- 편집 모드, 마우스 오른쪽 버튼 클릭 메뉴, 필요한 경우 스플라인 방향 전환
- 개체 모드, 오른쪽 클릭 메뉴, 메시로 다시 변환 .

메시에 대한 오브젝트 모드 오른쪽 클릭 메뉴에 Convert 가없는 이유를 모르겠습니다 .
@Seyed가 제공하는 구체화를 제외하고 스크립트는 다음과 같습니다.
import bpy
bpy.ops.object.convert(target='CURVE', keep_original= False)
bpy.ops.object.convert(target='MESH', keep_original= False)