테드옹의 VFX
그래픽스 이론 관련 본문
후디니에서는 pack된 다수의 오브젝트를 다룰 일이 가끔 있다.
시뮬레이션을 하지않고 애니메이션을 한다거나, post-sim의 개념으로 활용하거나 여러 방면으로 활용이 가능하다.
그럴 때마다 등장하는게 행렬과 벡터에 관한 선형대수의 개념이다.
물론 for-each같은 노드를 이용해서 할 수도 있겠지만, 이 방법이 훨~씬 빠르고 직관적이기 때문에 꼭 알아놔야함
선형대수에 관한 이론적인 증명 등은 아직 100%이해도 못했고, 더 자세하게 기술된 글들이 많으니 후디니 관점 위주로 서술!
[ Surface Normal, Tangent, Bitangent ]
Normal = 법선벡터, 평면(폴리곤)에 수직인 단위벡터
삼각형<p1, p2, p3>가 있다고 가정할 때(차례대로 반시계방향), p1과 p2를 이은 벡터 v1과 p1과 p3를 이은 벡터 v2를 외적하면 법선벡터를 구할 수 있다.
Tangent = 버텍스 노말과 u좌표가 일치하는 벡터 (=tangentu)
Bitangent = 버텍스 노말과 v좌표가 일치하는 벡터 (=tangentv)
*모든 노말과 외적되는 벡터는 탄젠트이기 때문에 탄젠트를 계산하는 기준이 여러가지 있다. 대표적인 방법이 위에 기술된 uv를 기준으로 잡는 방법
*Polyframe노드를 이용하면 폴리곤 계산을 할 수 있고, orient along curve노드를 사용하면 라인을 계산할 수 있음
[ Scale, Rotation, Translation ]
스케일과 회전은 행렬의 곱셈으로 표현하지만, 이동은 원래 행렬의 덧셈으로 나타낸다
하지만 동차좌표를 이용하여 이동역시 행렬의 곱셈으로 표현할 수 있다
Affine transform
- linear transform ; scale, rotation etc.
- translation
rigid body motion -> SRT에서 S이 빠진 강체모션(Rigid, 즉, 오브젝트의 모양이 변하지 않음)
[L|t] <-> [R|t] (선형변환|이동 <-> 회전|이동)
object space <-> world space
오브젝트를 생성할 때 사용된 좌표계를 object space라 부른다
다른 오브젝트들을 한 좌표계에 모은(assemble)것을 world space라 부른다
오브젝트 공간에서 월드 공간으로 옮겨가는 것을 world transform이라 부름
행렬끼리는 교환법칙이 성립하지 않기 때문에
R*T 행렬과 T*R행렬의 결과값은 당연히 다르다
보통은 [L|t]행렬에서 L이 먼저 적용된 다음 t행렬을 곱셈한다
역행렬을 곱하면 변형 전 원래형태로 돌아감 (이것을 활용하면 rest상태로 되돌릴 수 있다)
[2차원 회전]
P(x, y)를 a도만큼 회전 시킨다 -> P'(x', y') = (cosx - siny, sinx, cosy)
[3차원 회전]
각 축을 기준으로 회전행렬을 곱셈, 보통 순서가 정해져 있다.
임의의 축(예를 들어 피봇벡터)을 기준으로 회전해야할 때는 회전축을 변환하는 내부적 연산이 있다.
어짜피 회전은 행렬이 아닌 쿼터니언으로 계산할 것이지만 알아만 두기
키프레임 애니메이션 : 예전엔 1부터 24프레임이 있다면, 시니어 아티스트가 1, 13, 24번 프레임을 그리고 중간 프레임들은 주니어 아티스트가 채우곤 했다. 3D프로그램으로 옮겨보면 1, 13, 24는 키프레임이 되는 것이고, 중간 프레임들은 자동으로 보간(interpolated)되는 것이다.
하지만 오일러회전으로 보간을 하다보면 축이 겹쳐버리는 짐벌락현상이 일어날 수 있기 때문에 키프레임 애니메이션에 적합하지 않다. 그것을 해결하기 위해 쿼터니언(=사원수)이라는 개념을 3D 프로그램에 적용하기 시작했다.
쿼터니언은 복소수(a+bi)를 확장(j, k)한 것
Qxi + Qyj + Qzk + Qw(실수부) = (Qx, Qy, Qx, Qw) = (Qv, Qw)
후디니에서는 간단하게 quaternion(angle, axis)로 표현하면 된다
lerp -> linear interoplation
slerp -> spherical liner interpolation(4원수를 통한 보간법)
rotation은 quaternion인데, scale과 translation은 4x4행렬로 진행했다.
회전을 진행한 4원수 어트리뷰트는 matrix4 = qconvert(quaternion, offset)함수를 통하여 4차원 회전행렬로 변형시킬 수 있다. 그러므로 회전만 할 것이라면 굳이 행렬을 이용할 필요가 없다
활용은 setprimintrinsic함수와 packedfulltranform을 이용하면 된다
문과인데 열받네 진짜..
후디니를 통해서 사용했던 예제의 사진을 하나씩 추가할 예정!
행렬 참고 : https://medium.com/macoclock/augmented-reality-911-transform-matrix-4x4-af91a9718246
그래픽스 온라인 강의 : https://www.youtube.com/watch?v=774mc7tC594&list=PLYEC1V9tJOl03WLDoUEKbiYW_Xt4W6LTl&index=3
렌더링 기술의 역사 : https://www.youtube.com/watch?v=Qx_AmlZxzVk
레이트레이싱이란?(시리즈) : https://www.youtube.com/watch?v=gBPNO6ruevk&t
3차원 축회전 : https://inyongs.tistory.com/133
'Houdini' 카테고리의 다른 글
Constraints (1) | 2021.12.12 |
---|---|
point cloud (0) | 2021.12.06 |
Guided simulation (0) | 2021.11.26 |
그리드마켓 사용시 주의사항 (0) | 2021.11.07 |
렌더 패스를 어떻게 나눠야 할까 (0) | 2021.11.05 |