본문 바로가기
공부/컴퓨터 그래픽스

컴퓨터그래픽스 - 절단알고리즘 & 은면 제거(1)

by lroot 2020. 5. 30.
728x90
반응형

※ 지엘은 3차원 그래픽 처리를 위주, 고정된 하드웨어 파이프라인 구조를 가진 지엘에서는 2차원, 3차원을 구분하여 처리하는 것 자체가 부담이기 때문에, 2차원은 3차원으로 바꾸어 계산

 

2차원 버전의 gluOrtho2D(0,200,0,200)함수는 gluOrtho(0,200,0,200,-1,1)로 바뀌어 투상 행렬을 생성

 

가시부피 밖의 물체를 절단 할 때 절단의 기준이 되는 다각형을 절단 다각형, 일반적으로 2차원에서 절단 다각형은 윈도우, 뷰포트, 시저박스 등

 

절단 알고리즘

1. 코헨 - 서더랜드 알고리즘

2. 리앙 - 바스키 알고리즘

3. 서더랜드 - 핫지먼 알고리즘

4. 웨일러 - 에서톤 알고리즘

5. 내외부 판정 및 교차점

 

1.코헨 - 서더랜드 알고리즘

 

 4비트 아웃코드(Outcode)

 

 테스트1) E1 = E2 =0000

완전히 사각형 내부 선분이므로 보이는 선분으로 판정한다. 선분(A)

 

 테스트2) E1 & E2 !=0000

선분은 온전히 절단 사각형 밖에 있으므로 제거한다. 선분(B)

 

 테스트3) E1 != 0000, E2 = 0000 (또는 그 반대)

교참점 계산에 의해 절단한다. (선분 C)

 

테스트4) E1 & E2 = 0000

양끝점이 모두 절단 사각형 밖에 있지만 서로 다른 선분이다.

교참점 계산에 의해 절단한다. (선분 D, D')

 

선분분할

 

분할된 선분을 대상으로 다시 테스트

선분 D : E3 & E2 ! = 0000 이므로 온전히 외부 선분으로 무시

 

2. 리앙 - 바스키 알고리즘

교차점에서의 파라미터 값의 순서를 기준으로 여러 가지 경우를 판단

 

(a)

0 < t1 < t2 < t3 < t4 

 

(b)

0 < t1 < t3 < t2 < t4

 

3. 서더런드 핫지먼 알고리즘

선분을 연장한 직선을 기준으로 절단

Ex. 좌변기준의 절단

 

3차원 절단 

상, 하, 좌, 우, 전, 후의 6개의 면을 기준으로 절단

면을 기준으로 내외부 판정

 

Silicon Graphics의 Geometry Engine에 사용

 

 서더런드 - 핫지먼

볼록 다각형에만 적용

하나의 다각형으로 취급

오목 다각형 처리결과: 오류

 

 해법 1: 다각형 분할

오목 -> 볼록

 

 해법 2: 웨일러 - 애서톤 알고리즘

 

4. 웨일러 - 애서톤 알고리즘

 

 내부에서 외부로 가는 교차점이 추가되면 즉시 그 교차점으로부터 절단 사각형을 따라서 반 시계 방향으로 간다. 즉, 가장 최근에 외부에서 내부로 들어온 교차점을 만날 때까지 간다.

 

 1-C-D-2로 구성되는 하나의 다각형이 완성

 

 분리된 여러 개의 다각형을 생성함

 

5. 정점의 내외부 판정

 

(P-Q) * N > 0iff Pis Outside the Clip Plane

(P-Q) * N = 0iff Pis on the Clip Plane

(P-Q) * N < 0iff Pis Inside the Clip Plane

 

 

점과 평면선의 거리

법선벡터 방향이 면의 외부로 정의됨

d = H * P = (A,B,C,D)*(x,y,z,1) = Ax + By + Cz + D

Ax+By+Cz+D > 0iff Pis Outside the Clip Plane

Ax+By+Cz+D = 0iff Pis on the Clip Plane

Ax+By+Cz+D < 0iff Pis Inside the Clip Plane

p(t) = R+t(S-R) = (1-t)R+tS

x(t) = (1-t)Rx+tSx

y(t) = (1-t)Ry+tSy

z(t) = (1-t)Rz+tSz

 

(p(t)-Q)*N > 0iff Pis Outside the Clip Plane

(p(t)-Q)*N = 0iff Pis on the Clip Plane

(p(t)-Q)*N < 0iff Pis Inside the Clip Plane

 

p(t)*N = Q*N

(R+t(S-R))*N = Q*N

t = (Q-R)*N/(S-R)*N

 

 

'공부 > 컴퓨터 그래픽스' 카테고리의 다른 글

OpenGL glut 모델  (0) 2020.04.11

댓글