VMC Dual Cam Mixer
지난번 포스트에 이어 두 개의 카메라로부터 얻은 VMC 신호를 믹싱해주는 노드 앱을 만들었어요. 첫번째 카메라는 Webcam Motion Capture, 두번째 카메라는 TDPT 라는 어플에 연결했어요.
1. 과정
1.1 평균 내기
두 개의 신호를 단순히 받아서 섞어주기만 하면 되는 게 아니에요. 두 신호의 프레임률이 다르다 보니 한쪽에서 신호가 많이 들어온다고 다른 한쪽에서 그만큼 들어오는 게 아니었어요.
그래서 양쪽에서 서로 다른 포트로 신호를 받은 다음에 소프트웨어 태그를 붙여서 데이터 가공 포트로 신호를 보내기로 했어요. 그리고 이 신호들을 태그별로 묶어서 일정 시간 동안 받은 뒤 그것을 평균 내고, 그것을 양쪽 소프트웨어에서 실행하고 평균을 내고 있어요.
1.2 쿼터니온은 그대로 두기
그런데 일단 쿼터니온은 평균을 내지 않고, 마지막 값만 받아오기로 했어요. 사유는 아마도 쿼터니온 또한 벡터이기 때문에, 이걸 그대로 평균을 내 버리면 다음과 같은 이상한(..) 값이 얻어지는 모양이에요.
그러면 이 값은 어떻게 평균을 내는가? 오른쪽과 같이 각도로 변환을 하는 게 가장 만만한 것 같아요. 양쪽 소프트웨어에서 받아온 마지막 쿼터니온 값을 오일러 앵글로 변환해 준 다음 이 값의 평균을 내 줄 거예요. 아무튼 쿼터니온 값은 최대한 건드리지 말고, 오일러 앵글로 변환해서 건드린 다음 재변환해 주는 것이 나을 것 같습니다.
1.3 파츠별 가중치 주기
사실, 모든 파츠에서 신호를 섞는 것이 아니라, 양팔과 양다리를 경우에 따라 서로 다른 신호에서 읽어오도록 했어요.
일반적으로 왼팔은 왼쪽 카메라가, 오른팔은 오른쪽 카메라가 읽는 것이 자연스럽다고 생각하실 거예요. 하지만 저는 이걸 반대로 두었어요. 왼팔과 왼다리는 보통 오른쪽 카메라가 스캔하고, 오른팔과 오른다리는 보통 왼쪽 카메라가 스캔하도록 했습니다. 왜냐면 그래야 이 포즈에서 값을 읽어올지 말지 결정하기 쉽기 때문이에요.
즉, WMC나 TDPT의 경우 한쪽 팔이 보이지 않을 때 값을 읽지 못하기 때문에 팔을 아래로 떨어뜨린 포즈로 둡니다. 이것을 감지해서 반대쪽 팔이 보이면 그 팔을 읽어오고, 보이지 않으면 읽어오지 않는 것으로 하는 거죠.
팔을 카메라 쪽으로 뻗는 경우에도, 보통은 왼쪽 팔을 앞으로 뻗으면 왼쪽 카메라가, 오른쪽 팔을 앞으로 뻗으면 오른쪽 카메라가 가려지기 때문에 스캔하지 않는 것이 좋아요.
아무튼 여기까지 했으면 기존의 위치값과 오일러 앵글을 가지고 새 위치값과 오일러 앵글을 뽑아낸 다음에, 오일러 앵글에서 쿼터니온으로 변환까지 해 줍니다.
1.4 스무딩
저는 0.1초 간격으로 스캔을 하고 있는데, 이것은 초당 10프레임 정도의 상당히 낮은 프레임률이에요. 따라서 새로 계산한 값으로의 이동을 6프레임으로 쪼개서 60프레임을 만들어 주었습니다.
여기까지 구현해둔 것이 위의 영상이에요. 다만 위 영상에서는 쿼터니온도 평균을 내 버려서 동작이 조금 뚝딱거립니다.