CS/그래픽스

[홍정모의 그래픽스 새싹코스 Part1] 삼각형 그리기

겜도리도리 2023. 12. 9. 12:36
반응형

앞서

이 포스팅은 홍정모의 그래픽스 Part1을 수강하고 작성한 내용입니다.

강의의 세부 코드는 첨부하지 않고, 결과와 이론 위주로 포스팅했습니다.

 

개요

 

앞선 강의에서는 구를 그렸는데, 이번에는 삼각형을 그려보고자 한다.

구를 그릴 때와 같이, 삼각형을 그릴 때는 Ray가 삼각형 내부를 지나가는지 지나가지 않는지 확인하는 작업이 필요하다.

이를 IntersectRayTriangle 함수라고 하고, 매개변수로 활용하는 정보는 다음과 같다.

 

orig : Ray의 시작점

dir : Ray의 방향인

v0, v1, v2 : 삼각형의 세 좌표

 

또한 매개변수를 레퍼런스로 받아 저장해줘야하는 정보는 다음과 같다.

point : Ray와 삼각형의 충돌 지점

faceNormal : 삼각형의 법선 벡터

t : Ray에서 point까지의 거리

u, v도 있었지만 텍스쳐 매핑할 때 사용한다고 해서 이번 강의에서는 사용하지 않았다.

 

Ray가 삼각형 영역 안을 지나는지는 다음과 같은 과정으로 판별한다.

v0, v1, v2가 이루는 평면의 법선 벡터를 n이라고 한다.

또한 이 평면과 Ray의 교점을 p라고 한다. 그리고 Ray의 시작점을 o, 방향벡터를 d라고 한다면

Ray는 p = o + td로 나타낼 수 있다.

 

한편 p는 삼각형이 이루는 평면 위의 점이므로 p - v0와 n을 내적한 값 또한 0이다.

앞서 p = o + td이므로, o + td -v0과 n의 내젹한 값 또한 0이다.

그렇다면 t = (v0 dot n - o dot n) / d dot n 이 되고, 삼각형이 이루는 평면 위의 점 p의 위치를 알 수 있다.

 

t까지 구한 과정을 실행시켜보면 다음과 같다.

 

현재까지는 삼각형의 내부에 있는 지 판별한 게 아니라, 평면과 부딪히는 지 판별했으므로 삼각형 모양이 아니라 평면이 그려지게 된다.

따라서 외적을 활용해 삼각형 내부에 있는지, 외부에 있는지 검사해 줄 필요가 있다.

 

 

v0, v1, v2가 각각 p0, p1, p2로 바뀌었고 p대신 영역 안의 x, 영역 밖의 y, 영역 경계선의 z로 세분화하였다.

위 그림에서 보는 것과 같이 x, y, z에 대해 각각 p0, p1, p2에서 선을 긋는다. 그리고 변과 x, y, z에 대한 외적을 통해 작은 삼각형의 법선 벡터를 구하고, 이 법선 벡터와 삼각형의 법선 벡터 n의 내적값이 0보다 크다면 같은 방향을 가르키므로 영역 안에 있는 것이고, 0보다 작다면 다른 방향을 가르키므로 영역 밖에 있는 것을 알 수 있다.

 

세 선에 대해 모두 검사해주면 아래와 같이 삼각형을 그릴 수 있다.

 

결과

 

그림 출처

https://www.youtube.com/watch?v=qObJQesvZUU

반응형