- Frustum Culling Review
평면의 방정식을 유도하고 d 의미를 정리.
평면이란 3차원 공간 안에 있는 무한한 면이라고 할 수 있다.
평면의 특성을 찾기 위해서는 보통 처음에 노멀 벡터를 하나 정의를 한 상태로 시작을 한다.
그런데 여기서 노멀 벡터만 있게 되면 유일한 평면이 되지 않기 때문에 임의의 점을 추가로 지정해 준다.
평면의 방정식이라는 것은 이 상태에서 임의의 점을 지정했을 때,
이 점이 x, y, z축을 기준으로 해서 평면에 있을 조건을 명시한 것이 평면의 방정식이다.
평면의 방정식을 구하는 방법 중에 가장 무난한 것은 이 기하적인 특성에서 어떤 성질을 유도하는 것인데,
먼저 어떤 임의의 점이 있을 때 다음과 같이 벡터를 하나 만들어주고 이 벡터를 r 이라고 지정을 해준다.
그러면 노멀 벡터랑 평면 위에 두 점이 있을 때 두 점을 빼가지고 만든 벡터는 항상 직교하게 되므로
r = (x - x0, y - y0, z - z0) · N(a, b, c) = 0이 된다.
그렇게 r · N = 0이라는 성질을 가지고 P(x, y, z)가 평면에 있을 조건을 정의할 수 있고,
이것을 풀어쓰게 되면
a(x - x0) + b(y - y0) + c(z - z0) = 0이 나오게 된다.
여기서 x, y, z로만 구성을 하게 되면 x0, y0, z0는 상수라고 할 수 있고,
a(x - x0) + b(y - y0) + c(z - z0)는 상수면서 이미 알고 있는 값이기 때문에 d라고 할 수 있게 된다.
그렇게 ax + by + cz + d = 0이 나오게 되면서 평면의 방정식을 만들 수 있는데,
만약 여기서 노멀 벡터가 없다고 가정하면 어떻게 해야 될까?
점이 세 개가 있으면 가능하다.
노멀 벡터가 있지 않은 상태에서
새로 추가한 두 점과 외적을 통해 노멀 벡터를 만들 수가 있다.
따라서 점이 세 개가 주어지거나 노멀 벡터와 점 하나가 주어지면 평면을 구할 수 있게 된다.
그런데 점 세 개가 주어졌을 때는 외적의 순서에 따라서 방향이 바뀌기 때문에
어떤 점이 첫 번째 점인지 정확하게 명시를 해줘야 면의 방향이 뒤집히지 않게 설정을 할 수 있게 된다.
그럼 d의 의미는 무엇일까?
먼저 d의 값을 구해보자.
벡터 P가 있으면 N과 벡터 P의 내적인데
중요한 건 여기서 -가 붙어있는 것이다. 그래서 다음과 서로 같다고 할 수 있고,
d의 값은 다음과 같이 나오게 된다.
d의 의미를 알기 전에 먼저 한 가지를 짚고 넘어가 보자.
흔히 내적 얘기를 하는 중에 제일 많이 나오는 것 중 하나는 다음과 같은 투영 공식 하나가 있을 때
벡터의 투영 공식 중에는 두 가지만 생각하면 된다.
투영한 벡터를 구하는 것과 a라는 벡터와 b라는 벡터가 각 θ를 이루고 있을 때,
궁극적으로 구하는 것은 b라는 벡터에 투영했을 때 나오는 b´을 어떻게 구할 것인가를 계산 방법이라고 할 수가 있는데
방법은 두 가지가 존재한다.
첫 번째는 b´의 길이를 구하는 것이고
두 번째는 b의 벡터를 구하는 것이다.
그래서 길이가 얼마인지는 모르겠지만,
b´의 길이가 있다고 했을 때 이것은 어떻게 표현을 할 수가 있을까?
b´의 길이를 알고 있는 상태에서 b 벡터를 정규화한 것을 곱해주면 다음과 같이 벡터 b가 나오게 된다.
그러면 이제 b의 크기를 구해줘야 하는데, 여기서 삼각함수를 사용하게 되면
가 나오게 되고,
여기서 cosθ는 다음과 같이 내적으로 표현을 할 수가 있다.
그러면 이제 다음과 같이 acosθ를 구할 수 있고, 그것은 b´의 크기가 된다.
b´의 크기를 구한다는 것은
와 동일하다고 할 수 있는데 이것은 다음과 같이 다시 쓸 수가 있고,
이것은 벡터 b의 |b´|로 치환이 되면서
a와 b의 내적 한 결과가 스칼라가 나오게 되는데 이 스칼라에다가 벡터를 곱하게 되면
내적의 공식은 다음과 같이 나오게 된다.
정리를 하자면 내적이라고 하는 것은 어떤 벡터를 다른 벡터에다가 투영을 시키고,
그 투영한 벡터의 크기와 원래 있던 벡터의 크기를 서로 곱한 것이라고 정의할 수 있다.
앞에서 설명한 평면의 방정식으로 다시 가보자.
원점에서부터 벡터 P를 지나가는 평면이 있다고 가정하고,
노멀 벡터를 원점으로 옮겼을 때
벡터 P를 노멀 방향으로 투영을 시켰다는 얘기인데
노멀 벡터를 원점으로 옮겼을 때 투영한 벡터가 나오게 된다.
여기서 투영한 벡터를 N´이라고 하고, P0에서 원점을 뺀 벡터를 P라고 정한다.
앞에서 d라는 것은
이다.
그런데 이것은 투영 공식에서
에다가 투영한 것과 내적이 동일하다고 했었다.
이 투영 공식을 시각적으로 보게 되면 다음과 같다.
그런데 여기서 노멀 벡터를 1로 만들었다면
| N | 의 값은 1이기 때문에 무의미하게 되므로, 다음과 같이 내가 투영한 벡터의 크기만 남게 된다.
그러면 내적 한다는 것은 노멀 벡터가 크기가 1이라는 것을 제공한다면
결국에는 노멀 벡터에 투영한 벡터의 크기라고 알 수 있는데,
N' 크기는 무엇을 의미하는 것일까?
원점에서부터 평면 사이의 최단거리를 의미하게 되는데
즉, 이것은 원점에서부터 평면까지의 거리가 되는 것이다.
그런데 부호가 "-"이다.
부호가 "-"인 이유는 평면을 기준으로 해서 노멀의 반대 방향으로 -|N'|만큼 본다고 했을 때
-|N'|은 d라고 할 수 있게 된다.
평면의 방정식 ax + by + cz + d = 0에서 d는 원점에서 평면까지의 거리인데,
앞에 -가 붙어서 정의를 하게 된다고 할 수 있다.
- Euler angle Review
1. 짐벌락 현상에 대해 설명
먼저 x, y, z 세 개의 축이 있는데,
z축은 화면 쪽으로 나와 있어서 x, y축 처럼 표시가 따로 되어 있지 않다고 생각하면 된다.
이 상태에서 z축을 45도 방향으로 회전 시키고, y축을 90도 회전을 시키면 다음과 같이 나온다.
그런데 여기서 얼굴을 x축으로 회전 시키면 시계방향 또는 반시계 방향으로만 움직이게 되는데,
이것은 처음에 z축이 화면 쪽 방향일 때 z축을 회전 시킨 거랑 다름이 없다.
예를 들어서 다음과 같이 얼굴을 회전 시키고 싶은데,
이런 경우에는 z축을 바라보는 상태에서 x축을 돌리거나 그 반대로 하면 되는데, 아무래도 정해진 순서가 있기 때문에
다음과 같이 등장했을 때는 항상 x축과 z축은 똑같은 결과만을 양산하게 된다.
이와 같은 상황을 짐벌락 현상이라고 한다.
2. 오일러 각 표현의 장점과 단점
오일러 각 표현의 장점 | 오일러 각 표현의 단점 |
직관적으로 회전 설계가 가능 | 짐벌락 현상으로 인해서 원하는 방향으로 회전이 되지 않음. |
데이터 사용량이 적음 |
3. 오일러 각 표현으로 저장된 두 데이터는 한 축만 사용할 때에는 덧셈이 성립되나,
두 축 이상을 사용할 때에는 덧셈이 성립되지 않는다. 이유를 수학식으로 정리
다음과 같이 세 가지 오일러 각을 표현한다고 했을 때
E1 + E2 = E3가 된다는 것은 명확하게 인식할 수가 있는데,
여기서 pitch와 roll은 값이 0이다.
이런 경우 행렬로 표현을 하려면 어떻게 해야 할까?
세 가지 각을 행렬로 계산을 하면 회전 값이 0일 때는 전부 항등 행렬이 된다.
정리를 하면 다음과 같은 결과가 나오게 되고
여기서 I끼리 곱하면 똑같기 때문에 I를 빼고 계산을 하게 되면 다음과 같이 유도할 수가 있게 된다.
사실 한 축 회전만 잡고 오일러 공식을 사용하는 것에는 보간하는 부분에 대해서 아무런 문제가 없다.
그런데 문제는 다음과 같이 한 축이 아닌 두 축 이상을 사용했을 때이다.
이런 경우에 E1 + E2를 했을 때 값이 E3와 같은가?
일반적으로 계산을 해보게 되면
이렇게 나오게 된다.
이때 방향이 서로 같냐가 문제인데, 당연히 같을 수가 없다.
왜냐하면 다음과 같이 서로 p와 y가 서로 바뀌었다고 가정하면 같다고 할 수 있다.
그런데 문제는 이것이 서로 방향이 다르기 때문에 같지 않다고 할 수 있고 유도해서 구할 수는 있지만
한 축이 아닌 두 축 이상을 표현할 때에는 보간이 적용되지 않는다고 할 수 있다.
따라서 보간은 임의의 축에 대해서는 사용을 할 수가 없다고 정리할 수가 있다.
- Rodrigues Rotation Review
로드리게스 회전 공식의 유도 과정
어떤 점 P가 있고
축에 대한 노멀 값을 n,
원점에서부터 점 P에 대한 벡터를 r로 지정을 한다.
여기서 P라는 벡터가 있을 때 이것이 θ만큼 이동한 P´를 어떻게 구할지를 생각해보는 것인데,
벡터들이 이렇게 있을 때 이 벡터로 투영된 두 값은 어떻게 되는 것일까?
여기 있는 벡터들은 모두 같은 평면 위에 있기 때문에 원점으로부터 거리가 같다.
여기서 θ는 어떻게 구하는 것인가?
O´, Q, P에 대해서 구해보면 다음과 같다.
이 상태에서 θ만큼 이동한 것이 P´가되는데,
P´는 결과적으로 어떤 지점이 있다고 했을 때 O´ 에서 P´으로 가는 길과 O´ 에서 P로 가는 길이 서로 같다.
삼각함수로 계산을 하면
가 나오게 되고 최종적으로 다음과 같은 식이 나오게 된다.
'Programming > Soft Renderer_2020' 카테고리의 다른 글
GameEngine 3D : Quaternion, Quaternion Slerp (0) | 2020.07.16 |
---|---|
GameEngine 3D : 사원수 대수, 사원수 회전, 사원수의 활용 (1) | 2020.07.16 |
GameEngine 3D : Backface Culling, Perspective Projection (0) | 2020.06.25 |
GameEngine 3D : Space, Rotation, Camera (0) | 2020.06.17 |
지수 함수, 맥클로린 급수 (0) | 2020.06.12 |