무한평면과 놀기
   김성익 noerror@softnette.com
   2010/6/27
   KASA발표
목차
• 평면의 방정식 개요
• 기본편
 – 교차검사
 – 슬라이딩, 반사
 – 컬링에 응용
• 응용편
 –   볼록다각형(convex)
 –   클리핑
 –   BSP(Binary Spatial Partitioning)
 –   CSG(Constructive Solid Geometry)에 응용
 –   메시 파팅에 응용
평면의 방정식 개요
•   평면의 방정식 (Plane Equation)
    –   a*x + b*y + c*z + d = 0
    –   a*x + b*y + c*z = d’ (같은 공식 다른 표현)
•   점과 평면과의 거리 (Point to Plane)
    –   Distance(V) = a*Vx + b*Vy + c*Vz + d
    –   즉
         •   a*Vx + b*Vy + c*Vz + d > 0 : V는 평면보다 위에 있다
         •   a*Vx + b*Vy + c*Vz + d = 0 : V는 평면위에 있다
         •   a*Vx + b*Vy + c*Vz + d < 0 : V는 평면보다 아래에 있다
•   구성요소
    –   노멀방향 N = (a, b, c)
•   평면의 방정식 구하기
    –   평면의 방향과 평면위의 임의의 점 (VN, VP) = [VN,-Vn·Vp]
    –   평면위의 임의의 점 3개 (V1, V2, V3) = N:(V2-V1) x (V3-V1), [N, N·V1]
•   기타연산
    –   뒤집기
    –   정규화(Normalize)
교차검사
• 유한라인(Segment)와 평면 방정식
  – Segment 임의의 두 점을 연결하는 라인
  – 점의 쓸기 검사(SweepTest)
       • 시작점에서 임의의 위치로 이동




  –   툴상에서 카메라이용
       •   카메라위치, 피킹 벡터, 바닥평면을 이용 화면의 피킹한 월드위치
       •   카메라의 방향, 픽킹 위치를 이용, 카메라를 바라보는 평면의 방정식을 구해서 드래그처리
컬링에 응용
•   AABB(AxisAlignBoundingBox) vs 평면
    – AABB 가 평면위에 있는 지, 평면 아래에 있는 지 검사
        • 가장 가까운 위치 / 가장 먼위치 이용




        • 가장 가까운 위치가 평면 위에 있으면 AABB는 평면 위에 있다
            – 뷰프러스텀 컬링에 사용
        • 가장 먼 위치가 평면 아래에 있으면 AABB는 평면 아래에 있다
            – 어클루젼 컬링에 사용




•   구(Sphere) Vs 평면
컨벡스
•   볼록 도형 (Convex Polytope)
    – 임의의 평면으로 이등분됨
         • 분할된 두 다면체는 여전히 Convex !!
    – N개의 점으로 표현가능
    – N개의 평면으로 표현 가능
         • 반복적인 평면과의 연산으로 표현 가능
    – 대표적인 볼록 다면체
         • 절두체 (프러스텀 Frustum)
         • 박스 (Box)
    – 물리처리 기본단위
         • Convex이면서 단순화된 형태 Box
     – 컨벡스의 반대 : 오목 (Concave)
•   평면상의 컨벡스 도형
    –   폴리곤 (Polygon)
    –   가장 작은 단위 도형(Unit Shape) = 삼각형 (triangle)
    –   폴리곤 = 삼각형의 집합으로 표현 가능
    –   레스터라이제이션(Rasterization)
클리핑(1)
•   볼록한 평면도형을 평면으로 클리핑
    – 볼록한 평면도형 (TriangleFan의 형태)
    – N각형 (V1 -> V2 -> .. -> VN)
    – 알고리즘
       • 각 Edge를 순회하면서 테스트
          – VN-1 과 VN이 평면에 충돌하면 충돌 버텍스추가
          – VN이 평면위에 있으면 버텍스 추가
       • 예) 그림
          – [4->0] -> 0 -> [0->1] -> 1 -> [1->2] A -> 2 -> [2->3] -> 3 -> [3->4] B -> 4
클리핑(2)
•   폴리곤 뷰프러스텀 클리핑(View Frustum Clipping)
    – 프러스텀의 6면에 대해서 클리핑 실시~
    – 서덜랜드 호지먼(Hutherland-Hodgeman) 알고리즘
물리파괴
•   Convex 무한 평면으로 자르기를 물리에 적용
    –   각 폴리곤에 대해서 Split
    –   평면위의 폴리곤과 아래의 폴리곤으로 구분
    –   새로 생긴 Edge 정보를 이용 내부 채우기
    –   메시는 Convex가 아닐 수 있으나 물리 모델은 무조건 Convex
         • 물리엔진에는 버텍스 리스트만 올리면 OK
         • 메시 모델이 Convex가 아닌 경우 분할된 Edge로 채울 면
           만들때 주의 필요




    –   미리 분할하는 파괴랑은 다른 매력~ (E32010 메탈기어솔리드)
    –                 테스트예
                        http://www.youtube.com/watch?v=Tt0WNPeqd70
BSP
•   BSP (Binary Spatial Partitioning)
     – 씬매니징
         • 객체를 최적으로 효과적으로 분할 가능 (옥트리, 쿼드트리, Kd 트리와 비교)




     – BSP 메시모델
CSG에 응용(1)
•   CSG (Constructive Solid Geometry)
     –   속이 찬 볼록다면체(Convex Polyhedron)를 더하기 빼기 블린연산을 통해 메시정의




     –   둠, 하프라이프, 언리얼등에서 레벨 디자인에 사용되고 있음
          •   빠른 레벨 제작과 테스트
CSG에 응용(2)
•   두 컨벡스 다면체에 대해서 면 분할
    –   컨벡스 = 평면 집합 = 각 평면에 대해서 Solid와 Solid 아님으로 나뉘는 BSP트리
    –   A, B 연산시 A를 B의 각면에 대해서 분할 (분할시 완전 위의 면와 평면에 있거나 아래에 있
        는 그룹으로 나누고 평면에 있거나 아래에 있는 면들은 다음 면으로 순차적으로 분할)
    –   최종적으로 (A-B)와 (A&B) 의 그룹이 남음




    –   이 정보를 이용하여 블린연산
메시 파팅
•   메시 파팅 (from 마비노기 영웅전 캐릭터 커스터마이징 시스템)
    – 장착될 코스춤을 추가하기 전에 이전 메시의 일정 영역을 클리핑
•   알고리즘 (그냥 나름의 추측임)
    – 컨벡스로 정의된 자를 영역을 준비한다.
    – 메시의 간단한 계층 구조를 통해 컨벡스에 포함 안될 메시를 미리 제외시킨다
    – 서더랜드호지먼 방식처럼 미리 버텍스에 대해서 각 평면의 Up/Down 체크해서
      비트로 저장해둔다
       • 이 단계에서 비트 연산으로 포함 안될 face들을 추가로 추려낼 수 있음 (페이스안의 버
         텍스 모두 임의의 평면 위에 존재)
       • 클리핑할 필요없도 없이 제외되는 face들도 추려낼 수 있음 (펜이스 안의 버텍스 모든
         평면의 아래에 존재)
    – 각 평면에 대해서 순차적으로 분할 작업
끝~

10_무한 평면과 놀기

  • 1.
    무한평면과 놀기 김성익 noerror@softnette.com 2010/6/27 KASA발표
  • 2.
    목차 • 평면의 방정식개요 • 기본편 – 교차검사 – 슬라이딩, 반사 – 컬링에 응용 • 응용편 – 볼록다각형(convex) – 클리핑 – BSP(Binary Spatial Partitioning) – CSG(Constructive Solid Geometry)에 응용 – 메시 파팅에 응용
  • 3.
    평면의 방정식 개요 • 평면의 방정식 (Plane Equation) – a*x + b*y + c*z + d = 0 – a*x + b*y + c*z = d’ (같은 공식 다른 표현) • 점과 평면과의 거리 (Point to Plane) – Distance(V) = a*Vx + b*Vy + c*Vz + d – 즉 • a*Vx + b*Vy + c*Vz + d > 0 : V는 평면보다 위에 있다 • a*Vx + b*Vy + c*Vz + d = 0 : V는 평면위에 있다 • a*Vx + b*Vy + c*Vz + d < 0 : V는 평면보다 아래에 있다 • 구성요소 – 노멀방향 N = (a, b, c) • 평면의 방정식 구하기 – 평면의 방향과 평면위의 임의의 점 (VN, VP) = [VN,-Vn·Vp] – 평면위의 임의의 점 3개 (V1, V2, V3) = N:(V2-V1) x (V3-V1), [N, N·V1] • 기타연산 – 뒤집기 – 정규화(Normalize)
  • 4.
    교차검사 • 유한라인(Segment)와 평면방정식 – Segment 임의의 두 점을 연결하는 라인 – 점의 쓸기 검사(SweepTest) • 시작점에서 임의의 위치로 이동 – 툴상에서 카메라이용 • 카메라위치, 피킹 벡터, 바닥평면을 이용 화면의 피킹한 월드위치 • 카메라의 방향, 픽킹 위치를 이용, 카메라를 바라보는 평면의 방정식을 구해서 드래그처리
  • 5.
    컬링에 응용 • AABB(AxisAlignBoundingBox) vs 평면 – AABB 가 평면위에 있는 지, 평면 아래에 있는 지 검사 • 가장 가까운 위치 / 가장 먼위치 이용 • 가장 가까운 위치가 평면 위에 있으면 AABB는 평면 위에 있다 – 뷰프러스텀 컬링에 사용 • 가장 먼 위치가 평면 아래에 있으면 AABB는 평면 아래에 있다 – 어클루젼 컬링에 사용 • 구(Sphere) Vs 평면
  • 6.
    컨벡스 • 볼록 도형 (Convex Polytope) – 임의의 평면으로 이등분됨 • 분할된 두 다면체는 여전히 Convex !! – N개의 점으로 표현가능 – N개의 평면으로 표현 가능 • 반복적인 평면과의 연산으로 표현 가능 – 대표적인 볼록 다면체 • 절두체 (프러스텀 Frustum) • 박스 (Box) – 물리처리 기본단위 • Convex이면서 단순화된 형태 Box – 컨벡스의 반대 : 오목 (Concave) • 평면상의 컨벡스 도형 – 폴리곤 (Polygon) – 가장 작은 단위 도형(Unit Shape) = 삼각형 (triangle) – 폴리곤 = 삼각형의 집합으로 표현 가능 – 레스터라이제이션(Rasterization)
  • 7.
    클리핑(1) • 볼록한 평면도형을 평면으로 클리핑 – 볼록한 평면도형 (TriangleFan의 형태) – N각형 (V1 -> V2 -> .. -> VN) – 알고리즘 • 각 Edge를 순회하면서 테스트 – VN-1 과 VN이 평면에 충돌하면 충돌 버텍스추가 – VN이 평면위에 있으면 버텍스 추가 • 예) 그림 – [4->0] -> 0 -> [0->1] -> 1 -> [1->2] A -> 2 -> [2->3] -> 3 -> [3->4] B -> 4
  • 8.
    클리핑(2) • 폴리곤 뷰프러스텀 클리핑(View Frustum Clipping) – 프러스텀의 6면에 대해서 클리핑 실시~ – 서덜랜드 호지먼(Hutherland-Hodgeman) 알고리즘
  • 9.
    물리파괴 • Convex 무한 평면으로 자르기를 물리에 적용 – 각 폴리곤에 대해서 Split – 평면위의 폴리곤과 아래의 폴리곤으로 구분 – 새로 생긴 Edge 정보를 이용 내부 채우기 – 메시는 Convex가 아닐 수 있으나 물리 모델은 무조건 Convex • 물리엔진에는 버텍스 리스트만 올리면 OK • 메시 모델이 Convex가 아닌 경우 분할된 Edge로 채울 면 만들때 주의 필요 – 미리 분할하는 파괴랑은 다른 매력~ (E32010 메탈기어솔리드) – 테스트예 http://www.youtube.com/watch?v=Tt0WNPeqd70
  • 10.
    BSP • BSP (Binary Spatial Partitioning) – 씬매니징 • 객체를 최적으로 효과적으로 분할 가능 (옥트리, 쿼드트리, Kd 트리와 비교) – BSP 메시모델
  • 11.
    CSG에 응용(1) • CSG (Constructive Solid Geometry) – 속이 찬 볼록다면체(Convex Polyhedron)를 더하기 빼기 블린연산을 통해 메시정의 – 둠, 하프라이프, 언리얼등에서 레벨 디자인에 사용되고 있음 • 빠른 레벨 제작과 테스트
  • 12.
    CSG에 응용(2) • 두 컨벡스 다면체에 대해서 면 분할 – 컨벡스 = 평면 집합 = 각 평면에 대해서 Solid와 Solid 아님으로 나뉘는 BSP트리 – A, B 연산시 A를 B의 각면에 대해서 분할 (분할시 완전 위의 면와 평면에 있거나 아래에 있 는 그룹으로 나누고 평면에 있거나 아래에 있는 면들은 다음 면으로 순차적으로 분할) – 최종적으로 (A-B)와 (A&B) 의 그룹이 남음 – 이 정보를 이용하여 블린연산
  • 13.
    메시 파팅 • 메시 파팅 (from 마비노기 영웅전 캐릭터 커스터마이징 시스템) – 장착될 코스춤을 추가하기 전에 이전 메시의 일정 영역을 클리핑 • 알고리즘 (그냥 나름의 추측임) – 컨벡스로 정의된 자를 영역을 준비한다. – 메시의 간단한 계층 구조를 통해 컨벡스에 포함 안될 메시를 미리 제외시킨다 – 서더랜드호지먼 방식처럼 미리 버텍스에 대해서 각 평면의 Up/Down 체크해서 비트로 저장해둔다 • 이 단계에서 비트 연산으로 포함 안될 face들을 추가로 추려낼 수 있음 (페이스안의 버 텍스 모두 임의의 평면 위에 존재) • 클리핑할 필요없도 없이 제외되는 face들도 추려낼 수 있음 (펜이스 안의 버텍스 모든 평면의 아래에 존재) – 각 평면에 대해서 순차적으로 분할 작업
  • 14.