오목한 메쉬를 볼록한 메쉬 세트로 분해


10

두 가지 이유로 오목한 메쉬를 볼록한 메쉬 세트로 분해하고 싶습니다.

  1. 투명한 렌더링
  2. 물리 형태

삼각형 세트 (오목)를 입력으로 사용하고 많은 삼각형 세트 (볼록)를 출력하는 알고리즘이 있습니까? 원래 메쉬 부분 사이의 구멍을 채우지 않기를 원합니다.

나는 이미 작은 아이디어를 보았습니다 : 모든 오목한 가장자리를 찾고 가장자리 루프를 따라 메쉬를 분할하십시오. 내가 올바른 길을 가고 있습니까? 어떻게 구현할 수 있습니까?


"오목 / 볼록"메시 란 무엇입니까? 메시가 삼각형 네트워크를 의미하는 경우 볼록한 삼각형 세트 일뿐입니다. 아니면 3D 객체의 양에 대해 이야기하고 있습니까? 아마 다면체?
Ivan Kuckir

@IvanKuckir Meshes 또는 polyhedra는 오목 / 볼록 할 수 있으며 정의는 거의 동일합니다. 예를 들어 직선이 다면체의 내부를 두 번 이상 교차하지 않습니다.
congusbongus

답변:


11

나는 당신이 올바른 길을 가고 있다고 말하지만, 최적의 및 / 또는 효율적인 알고리즘을 생각해내는 것이 또 다른 문제입니다. 어려운 문제입니다. 그러나 귀하의 관심이 학업이 아니라면 충분한 해결책이 충분할 수 있습니다.

먼저, 자신의 솔루션을 제안 하지 않으려면 CGAL 에 이미 볼록 다면체 분해 알고리즘이 포함되어 있습니다. http://doc.cgal.org/latest/Convex_decomposition_3/index.html

이제 방법에 대해; 3D의 많은 문제와 마찬가지로 이해하기 쉬운 2D 문제를 고려하는 것이 종종 도움이됩니다. 2D의 경우 작업은 반사 정점을 식별하고 해당 반사 정점에서 새 모서리 (및 가능한 정점)를 생성하고 반사 정점이없는 상태 (따라서 모든 볼록 다각형)가 될 때까지 계속하여 다각형을 2 개로 분할하는 것입니다. ).

반사 정점

J. Mark Keil의 다각형 분해 에는 다음 알고리즘이 포함되어 있습니다 (최적화되지 않은 형태).

diags = decomp(poly)
    min, tmp : EdgeList
    ndiags : Integer
    for each reflex vertex i
        for every other vertex j
            if i can see j
                left = the polygon given by vertices i to j
                right = the polygon given by vertices j to i
                tmp = decomp(left) + decomp(right)
                if(tmp.size < ndiags)
                    min = tmp
                    ndiags = tmp.size
                    min += the diagonal i to j
    return min

기본적으로 가능한 모든 파티션을 철저하게 비교하고 생성 된 대각선이 가장 적은 파티션을 반환합니다. 이런 의미에서 그것은 다소 무차별 적이며 최적입니다.

"더욱보기 좋게"분해, 즉 길쭉한 형태가 아닌보다 작은 형태를 생성하는 분해를 원한다면, Mark Bayazit에 의해 생성 된 것을 고려할 수 있습니다 . 기본적으로 반사 정점을 반대 정점, 일반적으로 다른 반사 정점에 연결하여 작동합니다.

바 야지 트 새로운 정점 bayazit는 다른 반사 정점에 연결

단점 중 하나는 Steiner 점 (기존 가장자리에 존재하지 않는 점)을 만들어서 "더 나은"분해를 무시한다는 것입니다 .

두 개의 steiner point를 이용한 클로버 분해

3D의 문제는 비슷할 수 있습니다. 반사 정점 대신 "노치 모서리"를 식별합니다. 순진한 구현은 노치 가장자리를 식별하고 모든 다면체가 볼록해질 때까지 다면체에서 반복적으로 평면 절단을 수행하는 것입니다. 확인 버나드 채즐에 의해 "최악의 경우 최적의 알고리즘의 하한과 볼록 다면체 파티션을" 자세한 내용은.

노치가있는 다면체

이 접근 방식은 최악의 경우 다면체 수의 지수를 생성 할 수 있습니다. 이것은 다음과 같은 경우를 퇴화시킬 수 있기 때문입니다.

많은 노치 다면체

그러나 사소하지 않은 메쉬 (비정형 표면을 생각하면)는 어쨌든 결과가 좋지 않습니다. 복잡한 메시에 이것을 사용해야하는 경우 사전에 많은 단순화를 원할 가능성이 큽니다.


6

표면 (S)의 정확한 볼록 분해를 계산하는 것은 NP- 하드 문제이며 일반적으로 많은 수의 클러스터를 생성한다. 이러한 한계를 극복하기 위해, 정확한 볼록 구속 조건이 완화 될 수 있고 S의 대략적인 볼록 분해가 대신 계산된다. 여기서 목표는 최소 클러스터 수로 메시 삼각형의 파티션을 결정하는 동시에 각 클러스터가 사용자 정의 임계 값보다 낮은 오목한 부분을 갖도록하는 것입니다.

정확한 볼록 분해 대 대략적인 볼록 분해

다음의 대략적인 볼록 분해 라이브러리를 확인 하십시오 . https://code.google.com/p/v-hacd/ http://sourceforge.net/projects/hacd/


0

다음은 도움이 될 수 있는 코드 입니다. Java로되어 있으므로 C ++로 변환해야합니다.

여기 또한 당신을 도울 수있는 다른 기사 입니다


1
안녕하세요 마스크 반란군, 링크 전용 답변은 여기서 권장하지 않습니다. URL이 변경되거나 자원을 사용할 수 없게되면, 링크에 전적으로 의존하는 답변을 향후 사용자를위한 솔루션이 완전히 비어있을 수 있습니다. 답이 독자적으로 설 수 있고 독자가 더 깊이 클릭하기 전에도 문제를 해결하기위한 지침을 제공 할 수있는 한, 신용 및 추가 정보에 대한 링크를 제공하는 것이 좋습니다. 이 솔루션을 연결하는 솔루션의 작동 방식에 대한 최소한의 개요를 포함하도록이 답변을 편집하십시오.
DMGregory

@DMGregory 본인이 할 수없는 답변을 삭제하십시오.

답을 반드시 삭제할 필요는 없습니다. 더 많은 정보를 포함하도록 편집하면 훌륭한 답변이 될 수 있습니다.
DMGregory

@DMGregory 그러나이 게시물의 다른 답변과 중복됩니다. 나는 다른 답변을 편집하고 내 정보를 거기에 넣을 것입니다.

이 답변을 처음에 공유했을 때 새로운 것을 추가했다고 생각합니다. 기존 답변의 카본 사본이 아닌 방식으로 링크 된 코드를 설명 할 수 있다는 것은 의심의 여지가 없습니다. 그래도 삭제하려면 데스크톱 버전의 사이트에서 해당 링크를 사용할 수 있습니다.
DMGregory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.