PARTICLE02_Motion Blur
목차
- Part1. Motion Blur 이론
- Part2. MIXAMO Motion Blur 적용
- 일기
아직 solver에 들어가지 못한 부분은 아쉽지만, 지금 몇 가지 내용은 미리 공부해서 돌파해 둬야 앞으로 할 모든 solver의 이야기에서 도움을 받을 수 있다.
모션블러를 dynamic solver 활용 전에 이야기하는 이유
dynamic solver를 통해 좋은 결과를 얻어내기 위한 과정에서 자연스럽게 어마어마하게 많은 수정을 하게 된다. 그런데 상대적으로 motion blur에 대해서는 이것이 진심인가 싶을 정도로 수정을 안 하는 경우가 많다.
결과에 직결되는 상황임에도 이정도면 괜찮지 않을까? 하고 타협하는 경우를 많이 보게 되는데, 이렇게 타협을 하는 경우는 내 손에 쥐고 있는 옵션이 많지 않아서라고 생각한다. motion blur는 정말 좋은 양념이다. 좋은 만큼, 잘 써야 한다. velocity blur, 세팅 잡는 것 참 쉽다. 그런데 velocity blur가 우리의 결과에 딱 알맞은 세팅인가? 하는 질문에 확신을 가지고 답할 수 있어야 한다.
Part1. Motion Blur 이론
사진은 촬영을 시작하는 순간, 일시적으로 셔터가 열린다.
이때 셔터가 열려있는 동안, 빛의 정보가 필름에 저장되게 된다.
셔터스피드 : 셔터가 열려있는 시간
후디니에서는 셔터스피드를 셔터타임이라고 한다.
셔터가 1초 동안 열려있는 카메라 세팅이라고 하면, 증명사진을 찍는다면 우리는 움직이지 않으려고 노력할 것이다.
반대로 움직이는 물체가 촬영된다면 움직이는 잔상이 결과에 남게 될 것이다.
여기에서 말하는 잔상에 대한 내용이 motion blur이다.
같은 프레임의 모션으로, 위쪽 이미지는 motion blur가 적용되지 않은 것이고, 아래 이미지는 motion blur가 적용된 것이다.
잔상효과를 통해 우리가 얻을 수 있는 것은 마치 아날로그 한 방식으로 움직임을 포착한 것만 같은 표현을 할 수 있다는 것이다.
Camera의 Sampling에서 shutter time을 확인할 수 있다.
shutter time - 얼마나 셔터가 열려있었는지에 대한 내용
위 사진의 의미는 셔터가 0.5초 동안 열려있었음을 의미한다.
shutter time이 늘어난다면?
shutter가 더 오래 열려있었기 때문에, 더 많은 움직임을 포착하고 잔상으로 남긴 것을 확인할 수 있다. 잔상의 길이가 매우 길어졌다.
그럼 반대로 shutter time이 매우 짧다면?
카메라를 다뤄본 사람이라면, 합리적으로 이런 의문이 들 수 있다.
셔터 타임(셔터 스피드)이 늘어난다면, 빛이 들어오는 양 또한 늘어나니까 결과가 밝아져야 하는 것이 아닌가?
이렇게 생각할 수 있지만, 후디니에서는 아니다.
후디니에서의 motion blur는 그런 방식으로 작동하는 것은 아니다.
후디니에서의 motion blur는 우리가 정해둔 shutter time동안 읽어 들일 수 있는 정보들을 끌어모으고, Sample들을 blur 하는 방식으로 작동한다. 그래서 밝기에는 따로 영향을 주지 않는다.
render 결과에서 motion blur의 퀄리티를 정해주는 것이 있는데 그것이 바로 sample이다. 사용하는 sample의 양에 따라 결과가 달라진다.(많은 양의 sample을 사용하는 것은 좋은 결과를 나오게 할 것이고, 적은 양의 sample은 결과가 아쉬워지게 한다.)
현재는 Geo Time Samples의 20이라는 수치가 motion blur에 영향을 주고 있다.
여기에서 geo time samples의 수치 20이라는 말의 의미는
- 카메라의 shutter time(여기에서는 0.2) 동안 읽어 들일 수 있는 20개의 순간을 활용해서 motion blur를 만들어낸다는 의미이다.
geo time samples가 높아질수록 motion blur의 궤적이 부드러워진다.(퀄리티가 올라간다)
- 그렇다고 무턱대고 높이진 말자. 일정 수치 이상이 되면 유의미한 차이는 잘 보이지 않는다.
- 하지만, geo time samples의 수치를 내려보면 또 결과가 아쉽다.
주의할 점이 있다.
geo time samples의 수치가 높으면 높을수록 후디니가 cook 해야 할 내용이 많아지기 때문에 무거워진다고 적혀있다. 이 내용이 render time에 어마어마한 영향을 준다라고 확정적으로 말하기는 어렵다. 수치가 올라간다고 해서 무조건 render time이 늘어나는 것은 아니기 때문이다. 대신에 memory를 보면 수치가 높아졌을 때 memory 사용량이 많이 올라가게 된다. 이것은 배경과 함께 캐릭터가 움직이거나 point와 primitive의 양이 굉장히 많은 경우 geo time samples의 값을 올리는 것은 매우 부담스러운 일이 될 수 있다.
shutter offset
- motion blur에서 우리가 활용할 sample을 현재 프레임을 기준으로 과거에서 끌어올지, 미래에서 끌어올지, 혹은 과거와 미래 두 곳에서 끌어올지 정해주는 것
위에서부터 과거에서 sample을 끌어오는 shutter offset -1, 기준이 되는 현재 프레임(no blur), 과거와 현재에서 반반씩 sample을 끌어오는 shutter offset 0, 마지막으로 미래에서 sample을 끌어오는 shutter offset 1의 결과이다.
비교해 보면,
shutter offset이 -1일 때 현재 시간을 기준, 0.5초 전까지의 내용에서 geo time samples의 수치(6)만큼 sample을 활용하는 것이다. 그래서 motion blur가 끝나는 위치가 blur 먹지 않은 기준 프레임의 도끼날 끝의 위치와 동일한 것을 확인할 수 있다.(현재 프레임의 위치를 넘지는 않는다.)
반대로 shutter offset이 1일 때 현재 시간을 기준, 0.5초 이후의 내용에서 geo time samples의 수치(6)만큼 sample을 활용하는 것이다. 그래서 motion blur의 시작 위치가 blur 먹지 않은 기준 프레임의 도끼 뒤쪽 뾰족한 끝의 위치와 동일한 것을 확인할 수 있다.(마찬가지로 현재 프레임의 위치를 넘지는 않는다.)
약간의 제안
- 시간의 흐름이 순행인 것에 대해 작업할 때는 shutter offset을 -1로 두고 작업하는 경향이 있다.
- 시간의 흐름이 역행인 것에 대한 작업은 shutter offset을 1로 두는 것이 어울릴 것이다.
- 이유는, 물체가 잔상이 생길 때, 어디로 흘러가는지에 대한 것보다, 어떻게 흘러왔는지에 대한 잔상이 우리에게 조금 더 익숙하기 때문이다.
Sphere를 만들고 material을 적용해 준 뒤, render setting을 잡아준다.
(배경 만들고, 카메라 구도 잡고, 라이트 추가하고, Mantra 생성)
motion blur의 적용을 위해 key frame animaion으로 움직임을 추가해 주자.
60 프레임에서의 움직임을 생각해 보자.
sphere는 오른쪽에서 왼쪽으로 움직이는 상태이고, motion blur가 생긴다면, offset의 수치에 따라서 sphere의 우측, 좌우, 좌측으로 잔상이 생길 것이다.
mantra에서 allow motion blur를 체크해 주면, 아래와 같은 parameter 창을 확인할 수 있다.
그리고 motion blur는 적용이 안되고 있다.
왜 이럴까?
우리가 현재 활용하고 있는 sample은 geo time sample에 의한 결과이다. 하지만, geo time samples의 수치가 1인 경우, 하나의 정보만을 가지고 blur를 만드는 것은 의미가 없다. 최소한 두 개 이상은 되어야 blur가 형성된다.
geo time samples 수치를 2로 바꿨을 때, 잔상이 생겼다. 그리고 motion blur의 방향은 현재 offset의 수치(1)에 따라 sphere가 가고 있는 방향이다.
motion blur의 길이를 늘여보자. 길이를 늘이기 위해서는 shutter time의 값을 올려주면 된다.
- shutter time은 camera의 sampling 폴더에 있다.
계속 진행할 방향으로 잔상이 늘어나고 있다. 고치기 위해서 shutter offset을 -1로 바꿔주자.
이번에는 원운동을 하는 물체에 motion blur를 줘보자.
원운동을 하는 애니메이션인데, render의 결과는 직선운동을 하는 것처럼 보인다. 그 이유는 현재 geo time samples의 값이 2이기 때문에, sphere의 위치 2개 만을 활용해서 blur를 만들었기 때문에 이와 같은 결과가 나온 것이다.
카메라의 shutter time이 길어져도 render의 결과는 회전운동 같아 보이지는 않는다.
그렇다면, geo time samples의 수치를 올려주면 해결될까? 이론상, 해결되는 것이 맞다.
해결되지 않았다.
우리가 원했던 결과하고는 많이 차이가 있다.
어디가 문제일까?
우리는 현재 프레임에 대해 렌더를 진행하려 한다.
motion blur를 적용할 것이기에 shutter time의 수치만큼, motion blur로 생기는 잔상의 길이가 길어지게 된다.
shutter time의 길이가 짧다면(수치가 작다면) 짧은 구간 안에서 motion blur가 발생한다.
shutter time의 길이가 길다면(수치가 크다면) 긴 구간 안에서 motion blur가 발생한다.
임의의 shutter time이 정해져 있을 때, geo time samples의 값은 얼마나 많은 정보를 불러올지에 영향을 주게 된다.
위의 그림에서 geo time samples 4일 때를 보자. sample이 불러와지는 frame이 int형으로 떨어지는 것이 아닌, 36.5, 37.6 언저리 등등의 float형으로 나타나게 된다. render에서 shutter time에 의한 임의의 길이와 geo time samples의 수치가 나눠진 값에 의해 구체적인 float 정보로서 frame 정보들이 필요하게 된다.
원운동을 만들어줄 때, cos, sin 안쪽에 $F를 사용하였다. 그에 대한 결괏값은 다음과 같이 표현되게 된다.
아까 묘사한 geo time samples 수치 4와 같이 sample을 얻기 위해 frame과 frame 사이의 어떠한 float 한 구간에서도 정보를 가져오게 된다. 하지만, $F는 integer 형태의 frame 번호를 반환하게 되고, 42.2, 42.6, 42.9, 42.96 등 이 모든 float한 frame의 구간이 42 frame으로 반환이 되고, cos(42.2), cos(49.96)... = cos(42)와 같은 상황이 벌어진다.
geo time samples의 수치가 높아졌을 때, 같은 sample의 정보를 얻게 되는 경우가 발생한다는 의미이다.
그래서 cos($F) / sin($F)를 사용했던 원운동에 대한 motion blur가 저렇게 표현된 것이다.
우린 이것을 어떻게 해결해 줄 수 있을까?
cos / sin 안에 $F이 아닌, $FF을 사용해 주면 된다.
$F = 현재 프레임에 대한 integer 정보
$FF = 현재 프레임에 대한 float 정보
아까 제대로 된 결과가 나오지 않은 이유는 결국, 중간 소수점 frame의 결과들을 얻지 못했기 때문에 대표적으로 보이는 것들만 보이는 것이었다. integer 정보로 정보들이 겹쳐있는 상황이었다.
요약해 보자면,
우리는 motion blur의 세팅을 잡기 위해 shutter time으로 blur의 양을 정해줬다.
geo time samples의 값으로 얼마나 많은 sample을 사용할지 정해줬다.
하지만, 각각의 sample은 단순 integer frame정보만으로는 부족했다.
- ex) 0.3 frame과 0.7 frame의 정보가 필요한 상황인데, integer frame에서만 정보를 줄 수 있다면, 결과가 매우 아쉬워진다.
geo time samples를 활용한 motion blur는 motion blur 중에서도 가장 간단하고, 꽤나 강력한 것이다. 퀄리티 측면에서도 좋다. 하지만, geo time samples의 수치가 높아질수록 더 많은 sample을 복사해서 활용하기 때문에 무거워질 수 있다는 단점이 있다.
우리가 불러올 순간 중, float frame의 순간들이 존재한다. shutter time과 geo time samples의 수치에 따라 소수점의 순간들이 필요해서이다. float frame의 순간들을 잘 해결하지 못하면 geo time samples의 값이 늘어난다 하더라도 원하는 결과가 나오지 않을 수 있다.
다른 방식의 motion blur를 알아보자
xform time samples를 확인하려면 geometry 단계 위의 object 단계로 가봐야 한다.
object 단계에서 일어나는 motion blur에 대한 세팅이 xform time samples이다.
geo time samples와 마찬가지로 sample의 숫자이다. xform time samples가 2라는 의미는 두 개의 sample을 가지고 blur를 만들었다는 뜻이다.
object 단계에서의 움직임에 대해서는 xform time samples가 blur를 생성하는데 관여한다.
- 이때 geometry 단계에서 아무런 움직임이 없었다면, geo time samples는 작동하지 않는다.
velocity blur도 알아보자.
앞의 두 가지 형태의 motion blur는 geometry, object, 단계만 다를 뿐, 시간을 기준으로 위치 차이에 의해 sample들을 가져왔었다
velocity blur는 이와는 다르다.
시간에 따라 공간적인 위치를 가져오는 그런 내용이 아니다.
shutter time에 의해서 잔상의 길이는 달라질 수 있다. velocity blur의 잔상은 오로지 물체가 가진 속도값에 @v에 의해서 생성된다.
움직임은 없어도, velocity blur로 blur를 만들 수 있다.
그러기 위해서 속도에 대한 내용을 추가해줘야 한다.
그리고 velocity blur 활용을 위해 한 가지 세팅을 더 해줘야 한다.
object 단계로 나가서 geometry의 sampling 폴더 내의 velocity blur를 활성화해줘야 한다.
실제 물체는 정지해 있지만, 속도에 대한 정보값만으로 blur가 만들어졌다.
shutter time의 영향도 잘 받고 있다. 그리고 shutter offset 또한 잘 작동한다.
velocity blur가 작동하고 있을 때는, xform time samples와 geo time samples는 작동하지 않는다.(아무런 영향을 미치지 못한다.)
우리에겐 이제 motion blur를 만드는 세 가지 선택지가 생겼다.
- 기능적으로 보자면 두 가지로 분류된다.
- 실제 위치 정보를 기반으로 만드는 motoin blur
- geo time samples를 활용한 motion blur : geometry 단계의 위치 변화에 대한 blur
- time samples에 맞는 알맞은 정보들이 선택될 수 있어야 한다.
- float frame에 대한 개념이 필요하다.
- motion blur를 계획하고 무언가를 만든다면, $F 보다는 $FF를 활용하자.
- xform time samples를 활용한 motion blur :object 단계의 위치 변화에 대한 blur
- geo time samples를 활용한 motion blur : geometry 단계의 위치 변화에 대한 blur
- 속도 정보를 기반으로 만드는 motion blur
- @v에 대한 정보가 필요하다.
- object 단계에서 geometry의 sampling 폴더에서 velocity blur를 활성화해야 한다.
- xform time samples / geo time samples에 의한 motion blur는 발생하지 않는다.
- 실제 위치 정보를 기반으로 만드는 motoin blur
Part2. MIXAMO Motion Blur 적용
- MIXAMO 데이터를 불러서 Motion Blur를 적용해 보자.
순서
- MIXAMO에 가서 캐릭터 고르고, 애니메이션 고르고, 다운로드하기
- 머티리얼 적용하기
- 렌더 세팅 잡기
- 모션블러 적용하기
우선 MIXAMO 페이지에 접속한다.(https://www.mixamo.com)
- Adobe 계정으로 로그인을 해야 한다.
캐릭터 메뉴에 들어가면 많은 캐릭터가 보이는데, 어떠한 캐릭터도 활용이 가능하다.
수업에서 활용한 캐릭터를 골라보자.
우리에게 필요한 애니메이션을 골라준다.
- 애니메이션을 고를 때, 옆의 메뉴에 Overdrive라는 수치가 있다. 현재 50으로 되어있는데, 100으로 변경 시 속도가 빨라진다. 반대로 0이라면 속도가 느려진다.
이제 다운로드해준다. 주의할 점은 다운로드하는 경로명에 한글은 없어야 한다.
후디니에서 불러온다.
- 캐릭터 애니메이션이 적용된 FBX 파일을 활용하는 방법은 여러 가지가 있는데, 오늘 주된 내용은 Agent라는 것을 활용하는 방법을 사용할 것이다.
- 좀 더 고전적인 방법(Import FBX)으로도 FBX 파일을 불러올 수 있다.
엄청 큰 Brute가 화면에 들어왔다.
이 방법은 사용하지 않을 것이고, FBX 파일을 저장했던 곳으로 가보면 새로운 폴더가 생성되어 있다.
이 안에는 FBX 파일에서 사용된 Texture들이 들어있다.
우리는 이것들을 활용해서 material을 만들고 적용할 수 있다.
import fbx를 할 때, fbx 파일이 존재하는 폴더 안에 새로운 폴더가 생기고, 그 안에 texture가 저장된다는 사실을 기억하자.
이제 우리가 사용할 방식으로 fbx를 불러와보자.
일단 input을 fbx로 바꿔준다.
그리고 fbx file의 경로를 설정해 주면 적절한 크기로 fbx 파일이 불러와진다.
그리고 node info를 보면 pack 되어있음을 확인할 수 있다.
unpack 노드를 활용해서 pack을 풀어준다.
이제 기본적인 렌더 세팅을 진행해 보자.
배경으로 사용할 그리드를 세팅해 주고,
카메라를 생성해서 구도를 잡아준다.
라이트를 생성해서 적절한 조명 세팅을 진행하고,
out network view에 가서 mantra 노드를 생성한다.
스킨을 적용한다.
스킨 적용을 위해 material을 연결하는데, pack 된 데이터에는 연결의 의미가 없다.
scene view에서 select 모드로 들어가서 uv connected select를 활성화해서 확인한다. 각각 uv 번호에 따라 나뉜 것을 확인할 수 있다.
노드 아래에 material을 달아주자.
현재 우리가 적용하려는 texture는 이와 같다.
이 texture가 적용될 수 있는 uv의 번호를 체크하고, material의 group 항목에 기입해 주자.
그리고 mat network view에서 새로운 material을 만들어준다.
principled shader를 생성하고, texture 폴더에 가서 texture 경로를 기입해 준다.
specular가 너무 과하다.
roughness를 조절해 주고, base color를 조절해 줘서 원하는 느낌의 피부톤을 잡아준다.
그리고, bump & normal 폴더에 가서 캐릭터의 normal map의 경로를 지정해 줘서 normal map이 적용될 수 있도록 해준다.
나머지 부분에 대해서도 material을 적용해 준다.
이제 motion blur를 적용해 준다.
가장 먼저 떠오르는 것은, 시간에 따른 위치정보를 불러와서 motion blur를 줄 것인지, 각각의 point가 가지는 속도에 따라 motion blur를 줄 것인지 생각해봐야 한다.
일단, mantra parameter의 rendering 폴더에 보면 allow motion blur 항목이 있다. 이 부분을 체크해 주면 motoin blur가 적용된다.
그런데, 활성화해줬음에도 불구하고, 별반 차이가 없다.
그 이유로는,
우선 xform time samples의 값이 2라는 의미는 기준시간에 따른 object 단위에서 geometry의 transform에 의한 motion blur가 적용되느냐, 안되느냐 이다. 현재 object 상에서의 이동은 없었기 때문에 motion blur가 적용되지 않은 것이다.
xform time saples는 이용하지 않을 것이기 때문에 값을 1로 변경한다.
Geo time Samples의 값을 바꿔보자
Geo time Samples의 값을 5로 올린 결과이다. motion blur가 적용되고 있는 것을 확인할 수 있다.
그런데 motion blur의 방향이 앞을 향하고 있다. 이를 바꾸기 위해 Shutter Offset의 값을 1에서 -1로 변경해 준다.
Shutter Offset이 -1이라는 의미는, Motion blur가 적용되지 않았을 때를 기준으로 과거에서 sample을 불러오는 것이기에 도끼의 뒤쪽으로 motion blur가 만들어진다.
Shutter Offset이 1이라는 의미는 Motion blur가 적용되지 않았을 때를 기준으로 미래를 향해서 sample을 불러온다는 것을 뜻한다.
Geo Time Samples의 수치에 따라 현재는 총 5개의 sample을 불러오게 된다.
만약 motion blur의 길이가 아쉽다면, camera의 sampling 폴더로 가서 shutter time을 조절해 주면 된다.
지금 이용하고 있는 Geo Time Samples를 올려줌으로써 발생되는 motion blur는 생각보다 정확하다. 그리고 나쁘지 않은 결과가 나오는 것을 확인할 수 있다.
이번에는 Velocity blur를 사용해보려고 한다.
Velocity blur를 사용하고 싶다면, 우리가 가진 데이터 + 속도에 관한 정보가 필요하다.
Trail 노드를 달아주고, Result Type을 Compute Velocity로 변경해 줘서 속도에 대한 정보를 추가해 주자.
Velocity blur를 활성화해 주자.
Object 레벨에서 geometry 선택 후, render 폴더 > Sampling 으로 가면 Geometry Velocity Blur를 활성화할 수 있다.
mantra의 rendering에서는 allow motion blur가 체크만 되어있으면 된다.
velocity blur가 활성화되어 있다면, mantra의 rendering 폴더에 있는 motion blur 항목들 중 xform time samples와 geo time samples는 무시되고, shutter offset만 활용된다.
속도를 증가시킴에 따라 motion blur 또한 길어지는 것을 확인할 수 있다.
이제는 MIXAMO에서 데이터를 받아서 Motion blur를 적용할 수 있을 것이다.
용도에 맞게, 의도에 맞게 motion blur를 적절히 사용할 수 있기 바란다.
내가 시도해 볼 수 있는 option이 많아야 출력에 대한 tweak도 많이 해볼 수 있다.
motion blur를 만들어낼 수 있는 방법이 세 가지나 있었다는 것을 처음 알게 되었다.
mixamo도 알고는 있었지만, 제대로 활용하는 방법을 알지 못했는데, 이제는 캐릭터 애니메이션을 내가 직접 해주지 않아도 수많은 애니메이션을 활용할 수 있을 듯하다.
내일부터는 이제 신나게 파티클을 뿌릴 수 있다고 한다.
파티클 뿌리는 것에 신나서 전에 공부했던 것들 까먹지 말자...
반복 숙달만이 살 길이다.