버텍스 노멀을 통해 하나의 샤드로 냄비의 축 재구성

Aug 16 2020

한 조각에서 냄비 전체를 재구성 할 계획입니다.

나는 이미 그것을 할 방법을 생각했지만 실제로 코드에서 어떻게 할 수 있는지 모르겠습니다.

이론 : 모든 파편에는 특정 굴곡이 있습니다. 이 굽힘에는 다음 두 가지 정보가 포함됩니다.

  • 냄비 내 샤드의 방향
  • 냄비의 지름. 편집 모드에서 정점 법선을 켤 때 쉽게 확인할 수 있습니다. 기술적으로 도자기를 만드는 과정에서 모든 냄비의 중앙에 중심 축이 있습니다. 정점 법선은이 축을 교차하므로 정점 법선을 켤 때 축을 명확하게 볼 수 있습니다.

문제 : 스크립트를 통해 축을 어떻게 재구성합니까? 수학적으로는 정점 법선과 얇은 원통의 교차점입니다.

첫 번째 단계는 특정 선택에서만 정점 법선을 선택하는 것입니다. 바깥 쪽을 향할 필요가 없기 때문입니다.

테스트 샤드

답변

2 batFINGER Aug 18 2020 at 01:49

개념의 증거

볼록 껍질의 단일 선택된 가장자리에 대한 결과

더 나아가, 이것을 개념 증명으로가는 방법으로 추가했습니다.

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 치수의 일부보다 짧으면 아마도 주요 냄비 축이 아닐 것입니다. 일정 비율을 줄이는 것을 고려하십시오.

  • 어떤 방식 으로든 샤드 메시를 정리하거나 다듬습니다.