AI 비전 기반 3D 메시 UV 왜곡·오버랩 자동 감지와 수정 파이프라인

AI 비전과 UV 삼각형 기하 검사를 결합해 3D 메시의 UV 왜곡과 오버랩을 자동 탐지하고 아틀라스 재배치·재패킹·수동 검수까지 연결하는 실전 파이프라인을 설명합니다. Blender Python, OpenCV, IoU 임계값과 예외 처리 기준도 함께 다룹니다.

✓ 복사 완료!
챕터머티리얼 & 텍스처
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
AI 비전 기반 3D 메시 UV 왜곡·오버랩 자동 감지와 수정 파이프라인

핵심 요약

TL;DR: 3D 메시의 UV 품질 검사는 AI 비전만으로 끝내지 않고 UV 삼각형의 면적·각도·교차를 계산하는 결정론적 기하 검사를 기본으로 사용해야 합니다. AI 비전 모델은 체커 텍스처가 늘어지거나 반복되는 시각적 이상을 분류하고 우선순위를 정하는 역할을 맡기며 최종 수정은 UV 아일랜드 재언랩·재배치·재패킹 후 같은 검사를 다시 통과시키는 방식으로 구성합니다.

예시 대상으로 잡은 스택은 Blender 4.2 LTS와 번들 Python 3.11, OpenCV 4.x, PyTorch 2.x 또는 ONNX Runtime 기반 추론입니다. Blender 4.x 전체가 같은 Python 버전을 쓰는 것은 아니므로 실제 프로젝트에서는 Blender 버전에 맞는 번들 Python과 라이브러리 조합을 확인해야 합니다.

UV 왜곡과 오버랩 자동 검사가 필요한 이유

3D 에셋의 UV 문제는 단순히 텍스처가 깨지는 현상으로만 나타나지 않습니다. 다음과 같은 상태가 서로 다른 원인으로 발생할 수 있습니다.

문제주된 원인화면에서 보이는 증상적합한 검사
면적 왜곡UV 삼각형의 크기 비율 불균형체커 패턴이 특정 방향으로 늘어짐3D 면적과 UV 면적 비교
각도 왜곡언랩 과정에서 모서리 각도 변화원형 디테일이 타원형으로 보임삼각형별 각도 오차
UV 오버랩서로 다른 면이 같은 UV 영역 사용텍스처가 다른 면에 겹쳐 출력됨삼각형 교차 및 교집합 면적
의도된 미러링좌우 대칭 텍스처 공유정상적인 좌우 반전 텍스처머티리얼·아일랜드 메타데이터
패딩 부족UV 아일랜드 사이 간격 부족밉맵에서 색상 번짐 발생아틀라스 거리 검사

특히 UV 오버랩은 AI 이미지 분류만으로 정확하게 판정하기 어렵습니다. 아주 작은 교차 영역이나 얇은 삼각형의 교차는 렌더 해상도에 따라 사라질 수 있기 때문입니다. 따라서 오버랩의 확정 판정은 UV 공간의 삼각형 기하 계산으로 처리하고 AI는 시각적 이상과 검수 우선순위를 보조하는 것이 안전합니다.

UV 체커 텍스처가 적용된 3D 메시와 UV 아일랜드별 품질 검사 결과

전체 파이프라인은 어떻게 구성하는가?

자동화 파이프라인은 입력 데이터 정규화, 결정론적 검사, AI 비전 추론, 수정 후보 생성, 재검증의 다섯 단계로 나누는 것이 관리하기 쉽습니다.

flowchart LR
    A[Mesh and UV input] --> B[Data normalization]
    B --> C[UV geometry checks]
    B --> D[Checker texture render]
    D --> E[AI vision inference]
    C --> F[Findings and priority]
    E --> F
    F --> G[Unwrap or repack repair]
    G --> H[Recheck and report]

1. 메시와 UV 데이터를 정규화한다

먼저 다음 정보를 에셋 단위로 저장합니다.

  • 메시 식별자와 버전
  • UV 세트 이름. 예를 들어 UVMap, LightmapUV
  • 머티리얼 슬롯과 텍스처 채널
  • UV 아일랜드 ID
  • 삼각형 인덱스와 각 삼각형의 3D 정점 좌표
  • UV 좌표의 최소·최대 범위
  • 허용된 미러링 또는 타일링 정책

UV 좌표가 0에서 1 사이를 벗어나는 UDIM 또는 타일링 에셋이라면 모든 좌표를 단순히 클램프하면 안 됩니다. UDIM 타일 번호를 별도 필드로 분리하고 같은 타일 안에서만 오버랩을 검사하거나 프로젝트 정책에 따라 의도된 타일 경계를 허용 목록에 등록해야 합니다.

2. UV 왜곡은 어떻게 계산하는가?

삼각형 하나를 기준으로 3D 공간의 면적을 A_3D, UV 공간의 면적을 A_UV라고 하겠습니다. UV 아일랜드마다 전체 스케일이 다르므로 단순한 면적 비율만 비교하지 말고 같은 아일랜드의 중앙값으로 정규화하는 편이 안정적입니다.

DA=∣ln((AUV/A3D)/medianj(AUV,j/A3D,j))∣D_A = | ln( (A_UV / A_3D) / median_j(A_UV,j / A_3D,j) ) |

D_A가 0에 가까우면 해당 아일랜드 안에서 면적 비율이 균일하다는 뜻입니다. 값이 커질수록 삼각형별 텍셀 밀도 차이가 커집니다.

면적이 0인 퇴화 삼각형은 이 비율과 로그를 계산할 수 없으므로 정상 왜곡 점수에 섞지 말고 별도 오류로 보고해야 합니다. 각도 비교에서도 퇴화 삼각형을 제외하거나 따로 처리합니다.

각도 왜곡은 3D 삼각형의 세 내각과 UV 삼각형의 세 내각을 비교합니다.

Dθ=(∣θ1−θ1′∣+∣θ2−θ2′∣+∣θ3−θ3′∣)/(3π)D_θ = ( |θ_1 - θ'_1| + |θ_2 - θ'_2| + |θ_3 - θ'_3| ) / (3π)

실무에서는 D_A, D_θ, 가장 긴 변의 비율, UV 아일랜드의 뒤집힘 여부를 조합해 최종 왜곡 점수를 만들 수 있습니다.

Dtotal=wADA+wθDθ+wEDE+wFIflippedD_total = w_A D_A + w_θ D_θ + w_E D_E + w_F I_{flipped}

여기서 w_A, w_θ, w_E는 프로젝트별 가중치이며 I_flipped는 뒤집힌 삼각형이면 1, 아니면 0인 지시 함수입니다. 하드서피스 소품은 면적과 직선 보존에 높은 가중치를 두고 캐릭터 얼굴은 각도와 텍셀 밀도에 높은 가중치를 둘 수 있습니다.

3. UV 오버랩은 왜 기하 검사로 확정해야 하는가?

각 UV 삼각형을 2D 폴리곤으로 변환한 뒤 같은 UV 타일 안에서 서로 교차하는 삼각형 쌍을 찾습니다. 모든 삼각형을 서로 비교하면 메시가 커질수록 비용이 급격히 증가하므로 다음 순서를 권장합니다.

  1. 삼각형별 2D 바운딩 박스를 계산합니다.
  2. BVH, R-tree 또는 sweep line으로 바운딩 박스가 겹치는 후보만 추립니다.
  3. 후보 쌍에 대해 정확한 2D 삼각형 교차를 계산합니다.
  4. 공유 변과 동일한 정점에서 생기는 경계 접촉은 오버랩에서 제외합니다.
  5. 교집합 면적과 작은 삼각형 면적의 비율을 계산합니다.

쌍별 오버랩 비율은 다음처럼 정의할 수 있습니다.

Roverlap=Aintersection/min(Atriangle1,Atriangle2)R_overlap = A_intersection / min(A_triangle1, A_triangle2)

부동소수점 오차를 고려한 초기 기준으로 UV 면적 1e-6 이하는 무시하고 R_overlap >= 0.001인 경우를 우발적 오버랩 후보로 표시할 수 있습니다. 다만 미러링, 데칼, 타일링처럼 의도된 오버랩은 머티리얼 ID나 아일랜드 속성으로 예외 처리해야 합니다.

AI 비전 모델은 어떤 문제를 해결하는가?

AI 비전 단계의 입력은 원본 메시 자체보다 검사 목적에 맞게 렌더링한 이미지가 좋습니다. 예를 들어 Blender에서 체커 텍스처를 적용한 뒤 다음 이미지를 생성합니다.

  • 정면·측면·상단 등 고정된 직교 뷰
  • 8방향 턴테이블 뷰
  • UV 레이아웃을 1024×1024 또는 2048×2048로 래스터라이즈한 이미지
  • 와이어프레임과 아일랜드 ID가 표시된 디버그 이미지
  • 노멀, 곡률 또는 텍셀 밀도 히트맵

모델은 normal, stretched, seam-risk, visual-overlap-suspected와 같은 클래스를 예측하도록 학습할 수 있습니다. PyTorch로 학습한 분류·세그멘테이션 모델을 ONNX로 변환하면 DCC 툴 밖의 CI 서버에서도 ONNX Runtime으로 실행할 수 있습니다.

AI 출력은 다음과 같은 구조화된 결과로 저장합니다.

필드설명
p_distortion시각적 왜곡일 확률
p_overlap렌더 이미지에서 오버랩으로 보일 확률
mask문제가 발생한 픽셀 영역 또는 UV 영역
view_id이상을 발견한 카메라 뷰
model_version추론에 사용한 모델 버전

AI 모델의 확률만으로 자동 반려하지 말고 기하 검사 결과와 결합합니다. 예를 들어 p_distortion >= 0.8이면서 D_total >= 0.35인 경우에만 높은 우선순위로 올리는 방식입니다.

from dataclasses import dataclass

@dataclass
class Finding:
    island_id: int
    distortion: float
    overlap_ratio: float
    ai_confidence: float
    allowed_overlap: bool = False


def needs_repair(finding: Finding) -> bool:
    geometric_overlap = finding.overlap_ratio >= 0.001
    visual_anomaly = (
        finding.ai_confidence >= 0.80 and
        finding.distortion >= 0.35
    )
    return (
        geometric_overlap and not finding.allowed_overlap
    ) or visual_anomaly

UV 문제를 어떻게 자동 수정할까?

자동 수정은 한 번의 AI 생성 결과를 그대로 적용하는 방식보다 문제 유형에 따라 수정 전략을 선택하고 재검증하는 방식이 안전합니다.

Step 1. 문제를 유형별로 분류한다

  • overlap: 아일랜드 간 교차가 존재하는 경우
  • area_distortion: 텍셀 밀도가 불균일한 경우
  • angle_distortion: 형태나 각도가 크게 변한 경우
  • flipped: UV 삼각형 방향이 뒤집힌 경우
  • padding: 아일랜드 간 여백이 부족한 경우

Step 2. 수정 전략을 선택한다

문제 유형우선 수정 방법재검증 항목
작은 UV 오버랩아일랜드 재배치 또는 재패킹교집합 면적, 패딩
큰 UV 오버랩심 생성 후 재언랩오버랩, 왜곡 점수
면적 왜곡아일랜드 스케일 보정텍셀 밀도 편차
각도 왜곡Angle Based Unwrap 또는 적절한 투영각도 오차, 실루엣
뒤집힘UV winding 수정삼각형 방향
패딩 부족아틀라스 재패킹최소 거리와 밉맵 여백

Blender 4.x에서는 자동화 스크립트에서 bpy.ops.uv.unwrap, bpy.ops.uv.smart_project, bpy.ops.uv.pack_islands를 사용할 수 있습니다. 다만 bpy.ops는 현재 선택 객체, 편집 모드, UV 에디터 컨텍스트의 영향을 받으므로 배치 처리에서는 대상 오브젝트를 명시적으로 선택하고 실행 전후의 컨텍스트를 검증해야 합니다.

# Blender 4.x Python 예시: 수정 후보의 재패킹 개념
import bpy


def repack_active_uv(margin=0.003):
    obj = bpy.context.view_layer.objects.active
    if obj is None or obj.type != 'MESH':
        raise RuntimeError('활성 메시 오브젝트가 없습니다.')

    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.mesh.select_all(action='SELECT')
    bpy.ops.uv.pack_islands(
        rotate=True,
        margin=margin,
        shape_method='CONCAVE'
    )
    bpy.ops.object.mode_set(mode='OBJECT')

전체 재언랩은 UV를 크게 바꾸므로 텍스처 페인팅이나 기존 베이크 결과를 무효화할 수 있습니다. 따라서 변경 범위를 다음처럼 제한하는 편이 좋습니다.

  • 변경 전 UV를 버전 관리용 파일로 보관합니다.
  • 영향받은 아일랜드 ID만 재언랩 대상으로 지정합니다.
  • 기존 텍스처가 있는 에셋은 리프로젝션 또는 베이크 재실행을 예약합니다.
  • 자동 수정 후 왜곡·오버랩·패딩 검사를 모두 다시 수행합니다.

Step 3. 수정 결과를 승인 규칙에 통과시킨다

자동 수정의 성공 조건은 단순히 UV가 0에서 1 사이에 들어왔는지가 아닙니다. 다음과 같은 품질 게이트를 두는 것이 좋습니다.

오버랩 비율       = 0 또는 허용 목록에 포함
왜곡 점수         < 프로젝트 임계값
뒤집힌 삼각형     = 0
최소 패딩         >= 밉맵 정책 기준
UV 변경 면적      <= 허용된 변경 범위

예를 들어 소품 에셋은 D_total < 0.35, 캐릭터 얼굴은 D_total < 0.25처럼 자산 유형별 기준을 사용할 수 있습니다. 임계값은 임의로 고정하기보다 정상 에셋과 결함 에셋의 검수 결과를 모아 ROC 곡선이나 혼동행렬로 조정해야 합니다.

UV 아일랜드 교차 영역과 왜곡 점수를 표시한 자동 검수 리포트

데이터셋과 학습 라벨은 어떻게 준비하는가?

AI 비전 모델의 품질은 모델 구조보다 라벨 정책에 크게 좌우됩니다. 특히 정상적인 미러링 UV를 결함으로 학습시키면 자동 수정 단계에서 올바른 아일랜드를 분리해 버릴 수 있습니다.

권장 라벨은 다음과 같습니다.

  • 정상: 시각적 왜곡과 비허용 오버랩이 없는 상태
  • 경미한 왜곡: 텍셀 밀도 편차가 있지만 프로젝트 기준을 통과하는 상태
  • 심한 왜곡: 패턴 식별이 어려울 정도로 늘어진 상태
  • 비허용 오버랩: 예외 메타데이터에 없는 삼각형 교차
  • 허용 오버랩: 미러링·타일링·데칼 등 정책상 허용된 상태
  • 불확실: 카메라 가림이나 낮은 해상도로 판단이 어려운 상태

초기 데이터셋은 결정론적 검사 결과를 약한 라벨로 사용하고 아티스트가 표본을 검수해 수정하는 방식으로 만들 수 있습니다. 단, 약한 라벨을 그대로 정답으로 간주하지 말고 사람이 확인한 샘플을 별도의 검증 세트로 유지해야 합니다.

CI와 DCC 툴에 연결하는 방법

아트팀의 작업 흐름을 방해하지 않으려면 Blender 내부 버튼과 CI 검사를 분리합니다.

  1. 아티스트가 Blender 애드온에서 Validate UV를 실행합니다.
  2. Python 스크립트가 메시·UV·렌더 이미지를 생성합니다.
  3. 로컬 또는 빌드 서버에서 기하 검사와 AI 추론을 실행합니다.
  4. JSON 리포트에 문제 아일랜드, 삼각형 ID, 임계값, 모델 버전을 기록합니다.
  5. 자동 수정 후보를 적용한 뒤 동일한 검사 명령을 재실행합니다.
  6. 최종 리포트가 승인 기준을 통과하면 에셋을 패키징합니다.

리포트는 다음처럼 구조화할 수 있습니다.

{
  "asset": "prop_crate_01",
  "uv_set": "UVMap",
  "status": "needs_review",
  "findings": [
    {
      "type": "overlap",
      "island_ids": [12, 19],
      "triangle_ids": [440, 781],
      "ratio": 0.023,
      "allowed": false,
      "suggested_action": "repack"
    }
  ],
  "model_version": "uv-vision-2026-01",
  "geometry_check_version": "uv-checker-1.4"
}

자동 수정이 실패했을 때는 원본 파일을 덮어쓰지 않고 needs_review 상태로 남겨야 합니다. 사람이 확인할 수 있도록 UV 에디터용 선택 목록, 문제 영역의 색상 오버레이, 수정 전후 점수를 함께 제공하면 검수 시간이 줄어듭니다.

자주 묻는 질문 FAQ

UV 오버랩 검출을 AI 모델만으로 처리해도 되는가?

권장하지 않습니다. 픽셀 해상도와 카메라 각도에 따라 작은 교차가 누락될 수 있으므로 삼각형 교차와 교집합 면적을 계산하는 기하 검사를 기준으로 사용해야 합니다.

미러링 UV는 오버랩으로 잘못 판정되지 않는가?

그럴 수 있습니다. 미러링이 허용된 머티리얼 슬롯이나 아일랜드 쌍을 메타데이터로 표시하고 검사 단계에서 allowed_overlap 예외로 처리해야 합니다.

왜 모든 문제를 자동 재언랩하지 않는가?

재언랩은 심 배치와 UV 좌표를 크게 변경해 기존 텍스처 페인트와 베이크 결과를 무효화할 수 있습니다. 작은 오버랩은 재패킹으로 처리하고 심각한 왜곡만 재언랩 대상으로 분리하는 것이 안전합니다.

정리

AI 비전 기반 UV 품질 파이프라인의 핵심은 역할 분담입니다. UV 삼각형의 면적·각도·교차는 수치 기하 검사로 확정하고 체커 텍스처와 멀티뷰 렌더 이미지는 AI가 시각적 이상을 분류하도록 합니다. 이후 문제 유형에 맞춰 재배치, 재패킹, 심 생성, 재언랩을 선택하고 동일한 품질 게이트를 다시 통과시켜야 자동화가 신뢰성을 가집니다.

이 구조를 Blender 4.x 애드온과 CI 서버에 연결하면 아티스트가 작업을 마친 직후 UV 오버랩과 왜곡을 확인할 수 있고 수정 전후 결과도 에셋 버전과 함께 추적할 수 있습니다.