개요
enum class EBooleanOp
{
Union,
Difference,
Intersect,
TrimInside,
TrimOutside,
NewGroupInside,
NewGroupOutside
};FMeshBoolean에서 사용하는 불린 연산 타입을 정의한다. 크게 3가지 카테고리로 분류된다.
| 카테고리 | 연산 타입 | 메쉬 처리 | 특징 |
|---|---|---|---|
| 기본 불린 연산 | Union, Difference, Intersect | 두 메쉬 병합 | 두 메쉬를 하나로 결합 |
| Trim 연산 | TrimInside, TrimOutside | 단일 메쉬 수정 | 삼각형 삭제, 경계 엣지 생성 |
| NewGroup 연산 | NewGroupInside, NewGroupOutside | 단일 메쉬 수정 | 삼각형 보존, 그룹 분류 |
표
| 타입 | 설명 |
|---|---|
| Union | A, B 메쉬를 하나로 합친 결과를 반환한다. |
| Difference | A 메쉬에서 B 메쉬를 제거한 결과를 반환한다. |
| Intersect | A, B 메쉬의 겹친 부분을 반환한다. |
| TrimInside | A 메쉬에서 B 메쉬를 제거한다. 별도의 결과가 반환되는 것이 아닌 A 메쉬가 변경된다. |
| TrimOutside | A 메쉬에서 B 메쉬의 영역만 남긴다. 별도의 결과가 반환되는 것이 아닌 A 메쉬가 변경된다. |
| NewGroupInside | A 메쉬에서 B 메쉬 부분을 분리한다. 분리된 부분은 삭제하지 않고 새로운 그룹으로 추가된다. |
| NewGroupOutside | A 메쉬에서 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 내부에 있는 부분을 제거한다.
동작 과정
- A 메쉬만 처리 (
NumMeshesToProcess = 1) - B 메쉬는 절단 도구로만 사용
- A와 B의 교차선을 따라 A를 절단
- A의 삼각형 중 B 내부에 있는 것들을 삭제
- B 메쉬는 결과에 포함되지 않음
사용 예시
- 구를 평면으로 잘라서 아래쪽 반구 제거
- 큐브를 원통으로 잘라서 안쪽 부분 제거
코드 로직
if ( !KeepTri[ MeshIdx ][ TID ] )
{
ProcessMesh.RemoveTriangle( TID, true, false ); // 삭제
}2. TrimOutside
메쉬 A를 메쉬 B로 잘라서 B 외부에 있는 부분을 제거한다.
동작 과정
- A 메쉬만 처리
- A와 B의 교차선을 따라 A를 절단
- A의 삼각형 중 B 외부에 있는 것들을 삭제
- B 메쉬는 결과에 포함되지 않음
사용 예시
- 구를 평면으로 잘라서 위쪽 반구 제거
- 복잡한 메쉬를 바운딩 박스 안쪽만 남기기
Trim 연산 특징
| 특징 | 설명 |
|---|---|
| ✅ 메쉬 단순화 | 정점/삼각형 수 감소 |
| ✅ 경계 엣지 생성 | 절단 경계에 새로운 경계 엣지 생성 |
| ❌ 절단 도구 미포함 | B 메쉬는 결과에 포함되지 않음 |
NewGroup 연산 ( 단일 메쉬 수정 - 그룹화 )
NewGroup 연산도 한 메쉬만 수정하지만 삼각형을 삭제하지 않고 새 그룹으로 분류한다.
1. NewGroupInside
메쉬 A를 메쉬 B로 잘라서 B 내부에 있는 부분을 새 그룹으로 표시한다.
동작 과정
- A 메쉬만 처리
- A와 B의 교차선을 따라 A를 절단
- A의 삼각형 중 B 내부에 있는 것들을 찾음
- 삭제하지 않고 새로운 TriangleGroup ID를 할당
- 연결되지 않은 컴포넌트는 각각 다른 그룹 ID 부여
코드 로직
if ( bRegroupInsteadOfDelete )
{
ProcessMesh.SetTriangleGroup( TID, NewGroupID ); // 그룹만 변경
NewGroupTris.Add( TID );
}2. NewGroupOutside
메쉬 A를 메쉬 B로 잘라서 B 외부에 있는 부분을 새 그룹으로 표시한다.
동작 과정
- A 메쉬만 처리
- A와 B의 교차선을 따라 A를 절단
- A의 삼각형 중 B 외부에 있는 것들을 새 그룹으로 표시
NewGroup 연산 특징
| 특징 | 설명 |
|---|---|
| ✅ 토폴로지 보존 | 삭제 없이 메쉬 구조 유지 |
| ✅ 그룹 ID 구분 | 영역별 그룹 ID로 구분 가능 |
| ✅ 컴포넌트 분리 | 연결되지 않은 컴포넌트 자동 분리 |
| ❌ 경계 엣지 미생성 | 경계 엣지를 생성하지 않음 |
| 🎯 사용 목적 | 원본 메쉬 유지하면서 영역별 다른 처리 ( 머티리얼, 물리 등 ) 필요시 |
사용 예시
- 캐릭터 메쉬를 물과 교차시켜 물속/밖 부분을 다른 셰이더로 렌더링
- 지형을 건물로 잘라서 실내/실외를 다른 라이팅으로 처리
- UV 좌표나 노멀을 유지하면서 영역 분류