버텍스 노멀을 통해 하나의 샤드로 냄비의 축 재구성
한 조각에서 냄비 전체를 재구성 할 계획입니다.
나는 이미 그것을 할 방법을 생각했지만 실제로 코드에서 어떻게 할 수 있는지 모르겠습니다.
이론 : 모든 파편에는 특정 굴곡이 있습니다. 이 굽힘에는 다음 두 가지 정보가 포함됩니다.
- 냄비 내 샤드의 방향
- 냄비의 지름. 편집 모드에서 정점 법선을 켤 때 쉽게 확인할 수 있습니다. 기술적으로 도자기를 만드는 과정에서 모든 냄비의 중앙에 중심 축이 있습니다. 정점 법선은이 축을 교차하므로 정점 법선을 켤 때 축을 명확하게 볼 수 있습니다.
문제 : 스크립트를 통해 축을 어떻게 재구성합니까? 수학적으로는 정점 법선과 얇은 원통의 교차점입니다.
첫 번째 단계는 특정 선택에서만 정점 법선을 선택하는 것입니다. 바깥 쪽을 향할 필요가 없기 때문입니다.
테스트 샤드
답변
개념의 증거
더 나아가, 이것을 개념 증명으로가는 방법으로 추가했습니다.
Fistly 여기에는 오브젝트와 메시를 다른 오브젝트로 복사하고 편집 모드로 들어가 볼록 껍질로 변환하는 스크립트가 있습니다.
샤드를 선택하고 실행
import bpy
bpy.ops.object.mode_set()
bpy.ops.object.duplicate(linked=False)
dupe = bpy.context.object
dupe.display_type = 'WIRE'
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.convex_hull()
그 후 모든 지오메트리가 선택된 편집 모드에서 원본의 볼록 껍질의 새 와이어 프레임.
다음 스크립트는 선체의 가장자리를 통과하여 메시에서 중간 지점에 가장 가까운 지점을 찾고, 여기에 설명 된대로이를 사용하여 코드에서 원을 만듭니다. 수학적으로 올바른 호 / 원 세그먼트를 만들려면 어떻게해야합니까?
시각화하기 위해 원 중심과 두 개의 연결 모서리에 vert를 추가했습니다. 데이터가 반경, 중심 좌표 및 법선으로 저장되므로 (회전축은 두 에지 벡터의 정규화 된 외적)
테스트 스크립트, 선택한 각 모서리에 대해 예측 원 "쐐기"를 만듭니다. 편집 모드에서 볼록 껍질 메시로 실행하고 관심 가장자리를 선택합니다.
import bpy
import bmesh
from math import asin, degrees
context = bpy.context
scene = context.scene
ob = context.object
me = ob.data
bm = bmesh.from_edit_mesh(me)
shard = scene.objects.get("3D_Scherbe_Model_50K")
#edges = bm.edges[:] # all edges
edges = [e for e in bm.edges if e.select]
#edges = [e for e in bm.select_history if isinstance(e, bmesh.types.BMEdge)]
for edge in edges:
o = (edge.verts[1].co + edge.verts[0].co) / 2
hit, loc, _, _ = shard.closest_point_on_mesh(o)
if hit:
h = (loc - o).length
if h < 0.1:
print("On surface")
continue
a = edge.calc_length() / 2
r = (a * a + h * h) / (2 * h)
if abs(a / r) > 1:
# math domain error on arcsin
print("N/A")
else:
angle = 2 * asin(a / r)
print(f"{r} {degrees(angle)}")
vc = bm.verts.new(o + r * (o - loc).normalized())
for v in edge.verts:
bm.edges.new((v, vc))
bmesh.update_edit_mesh(me)
me.update()
노트.
가장 가까운 지점에서 가장자리 중심까지 원을 예측하는 대신 가장자리를 걸어 가면서 샘플 지점을 만들 수 있습니다. https://meshlogic.github.io/posts/jupyter/curve-fitting/fitting-a-circle-to-cluster-of-3d-points/ 과 https://github.com/ndvanforeest/fit_ellipse @RobinBetts가 제안한대로.
마찬가지로 생성 된 원 추정치를 사용하여 실제 메시 표면에 대해 테스트 할 수 있습니다.
메쉬의 가장 가까운 지점에서 반환 된 법선을보십시오.
선택 범위를 좁 히면 특정 범위 내에서 반경 또는 쐐기 각도를 제안하는 기록 데이터가 있습니다.
각각의 반경과 각도가 같으면 완벽하게 일치하는 모서리의 동일한 길이 "서브 코드"를 메시에 투영합니다 (메시에서 가장 가까운 지점). 최상의 착용감을 위해 최소화하십시오.
경계 상자 치수를 확인하십시오. 모서리가 최소 bbox 치수의 일부보다 짧으면 아마도 주요 냄비 축이 아닐 것입니다. 일정 비율을 줄이는 것을 고려하십시오.
어떤 방식 으로든 샤드 메시를 정리하거나 다듬습니다.