개요


enum class EBooleanOp
{
    Union,
    Difference,
    Intersect,
    TrimInside,
    TrimOutside,
    NewGroupInside,
    NewGroupOutside
};

FMeshBoolean에서 사용하는 불린 연산 타입을 정의한다. 크게 3가지 카테고리로 분류된다.

카테고리연산 타입메쉬 처리특징
기본 불린 연산Union, Difference, Intersect두 메쉬 병합두 메쉬를 하나로 결합
Trim 연산TrimInside, TrimOutside단일 메쉬 수정삼각형 삭제, 경계 엣지 생성
NewGroup 연산NewGroupInside, NewGroupOutside단일 메쉬 수정삼각형 보존, 그룹 분류



타입설명
UnionA, B 메쉬를 하나로 합친 결과를 반환한다.
DifferenceA 메쉬에서 B 메쉬를 제거한 결과를 반환한다.
IntersectA, B 메쉬의 겹친 부분을 반환한다.
TrimInsideA 메쉬에서 B 메쉬를 제거한다. 별도의 결과가 반환되는 것이 아닌 A 메쉬가 변경된다.
TrimOutsideA 메쉬에서 B 메쉬의 영역만 남긴다. 별도의 결과가 반환되는 것이 아닌 A 메쉬가 변경된다.
NewGroupInsideA 메쉬에서 B 메쉬 부분을 분리한다. 분리된 부분은 삭제하지 않고 새로운 그룹으로 추가된다.
NewGroupOutsideA 메쉬에서 B 메쉬 부분이 A 메쉬가 되고 나머지 부분이 새로운 그룹으로 추가된다.


기본 불린 연산


1. Union ( 합집합 )

A ∪ B = 두 메쉬를 합친 결과

동작 방식

  • 두 메쉬의 외부 표면만 유지
  • 각 메쉬에서 상대 메쉬 내부에 있는 삼각형들을 삭제
  • 결과: 두 메쉬가 하나로 합쳐진 외곽 쉘

2. Difference ( 차집합 )

A - B = A에서 B를 뺀 결과

동작 방식

  • A에서 B가 차지하는 부분을 제거
  • 특수 처리: B 메쉬의 모든 삼각형 방향을 뒤집음 ( 내부를 외부로 )
  • 결과: A의 외부 + B가 파낸 공간의 내부

3. Intersect ( 교집합 )

A ∩ B = 두 메쉬가 겹치는 부분만

동작 방식

  • 두 메쉬의 겹치는 영역만 유지
  • 각 메쉬에서 상대 메쉬 외부에 있는 삼각형들을 삭제
  • 결과: 두 메쉬가 모두 차지하는 공간


Trim 연산 ( 단일 메쉬 수정 - 삭제 )


Trim 연산은 한 메쉬만 수정하며 삼각형을 실제로 삭제한다.


1. TrimInside

메쉬 A를 메쉬 B로 잘라서 B 내부에 있는 부분을 제거한다.

동작 과정

  1. A 메쉬만 처리 ( NumMeshesToProcess = 1 )
  2. B 메쉬는 절단 도구로만 사용
  3. A와 B의 교차선을 따라 A를 절단
  4. A의 삼각형 중 B 내부에 있는 것들을 삭제
  5. B 메쉬는 결과에 포함되지 않음

사용 예시

  • 구를 평면으로 잘라서 아래쪽 반구 제거
  • 큐브를 원통으로 잘라서 안쪽 부분 제거

코드 로직

if ( !KeepTri[ MeshIdx ][ TID ] )
{
    ProcessMesh.RemoveTriangle( TID, true, false );  // 삭제
}

2. TrimOutside

메쉬 A를 메쉬 B로 잘라서 B 외부에 있는 부분을 제거한다.

동작 과정

  1. A 메쉬만 처리
  2. A와 B의 교차선을 따라 A를 절단
  3. A의 삼각형 중 B 외부에 있는 것들을 삭제
  4. B 메쉬는 결과에 포함되지 않음

사용 예시

  • 구를 평면으로 잘라서 위쪽 반구 제거
  • 복잡한 메쉬를 바운딩 박스 안쪽만 남기기

Trim 연산 특징

특징설명
✅ 메쉬 단순화정점/삼각형 수 감소
✅ 경계 엣지 생성절단 경계에 새로운 경계 엣지 생성
❌ 절단 도구 미포함B 메쉬는 결과에 포함되지 않음


NewGroup 연산 ( 단일 메쉬 수정 - 그룹화 )


NewGroup 연산도 한 메쉬만 수정하지만 삼각형을 삭제하지 않고 새 그룹으로 분류한다.


1. NewGroupInside

메쉬 A를 메쉬 B로 잘라서 B 내부에 있는 부분을 새 그룹으로 표시한다.

동작 과정

  1. A 메쉬만 처리
  2. A와 B의 교차선을 따라 A를 절단
  3. A의 삼각형 중 B 내부에 있는 것들을 찾음
  4. 삭제하지 않고 새로운 TriangleGroup ID를 할당
  5. 연결되지 않은 컴포넌트는 각각 다른 그룹 ID 부여

코드 로직

if ( bRegroupInsteadOfDelete )
{
    ProcessMesh.SetTriangleGroup( TID, NewGroupID );  // 그룹만 변경
    NewGroupTris.Add( TID );
}

2. NewGroupOutside

메쉬 A를 메쉬 B로 잘라서 B 외부에 있는 부분을 새 그룹으로 표시한다.

동작 과정

  1. A 메쉬만 처리
  2. A와 B의 교차선을 따라 A를 절단
  3. A의 삼각형 중 B 외부에 있는 것들을 새 그룹으로 표시

NewGroup 연산 특징

특징설명
✅ 토폴로지 보존삭제 없이 메쉬 구조 유지
✅ 그룹 ID 구분영역별 그룹 ID로 구분 가능
✅ 컴포넌트 분리연결되지 않은 컴포넌트 자동 분리
❌ 경계 엣지 미생성경계 엣지를 생성하지 않음
🎯 사용 목적원본 메쉬 유지하면서 영역별 다른 처리 ( 머티리얼, 물리 등 ) 필요시

사용 예시

  • 캐릭터 메쉬를 물과 교차시켜 물속/밖 부분을 다른 셰이더로 렌더링
  • 지형을 건물로 잘라서 실내/실외를 다른 라이팅으로 처리
  • UV 좌표나 노멀을 유지하면서 영역 분류