BodyTracking 3D parallax
BodyTracking 3D parallax는 Azure Kinect로 사용자의 머리 위치를 추정하고 Unity의 비대칭 투영에 연결해, 일반 모니터를 움직임에 따라 시점이 바뀌는 가상 창처럼 보이게 만든 프로젝트다.
역할
- Azure Kinect 좌표 변환 · 물리 화면 크기 연동 · 비대칭 투영 적용 · Unity 통합
결과
- 2024 실감관광콘텐츠 경진대회 최우수상
Azure Kinect와 Unity를 연결한 기술 시연. 화면 앞에서 움직일 때 카메라 시점과 가려진 장면이 함께 달라진다.
일반 모니터의 3D 장면은 화면 앞에서 고개를 움직여도 같은 시점에 머문다. 이 프로젝트에서는 움직임에 맞춰 Unity 카메라의 투영을 바꿔, 옆으로 이동할 때 가려져 있던 장면을 볼 수 있게 했다.
5인 팀으로 2024년 5월부터 6월까지 개발했다. 이후 관광 콘텐츠로 확장해 경진대회에 출품했다.
내가 맡은 일
나는 Azure Kinect의 추적값을 화면 기준 좌표로 바꾸고 Unity의 비대칭 투영 카메라에 연결했다. Windows에서 모니터의 물리 크기를 구하는 연동을 만들었고 투영 평면 구현을 교체하면서 KineticToCamera와 장면 전체를 다시 연결했다.
두 눈의 중간 위치를 구하는 코드는 변재현이, 필터와 일부 좌표 처리는 권용현과 김민수 등이 맡았다. Azure Kinect의 body-tracking sample과 공개 비대칭 투영 구현도 활용했다. 나는 이 요소들을 물리 화면 크기와 Unity 카메라에 맞춰 하나의 장면으로 통합했다.
머리 위치의 화면 좌표 변환
이 값은 시선 추적 결과가 아니다. Azure Kinect Body Tracking이 추정한 EyeLeft와 EyeRight 관절의 중간 위치를 머리 위치의 근사값으로 사용했다. 여러 사람이 잡히면 센서에서 가장 가까운 사람을 선택하고 필터로 흔들림과 추적 손실을 처리했다.
센서 좌표는 밀리미터 단위이고 Unity와 축 방향도 달랐다. KineticToCamera에서 미터 단위로 바꾸고 센서 중심과 화면 중심의 차이를 보정한 뒤 가상 카메라에 전달했다. Win32 GetDeviceCaps로 구한 모니터 크기도 반영해 실제 이동 거리와 가상 화면의 시점 변화를 맞췄다.
가상 창을 위한 비대칭 투영
카메라 위치만 옮기면 사용자가 화면 중심에서 벗어날 때 실제 모니터와 가상 화면의 경계가 어긋난다. Mixed Reality TVs 연구를 참고해 머리 위치가 바뀔 때 화면의 네 모서리를 기준으로 비대칭 투영 범위도 다시 계산했다.
초기에는 Paul Bourke의 AsymFrustum 예제를 사용했고 이후 Robert Kooima의 Generalized Perspective Projection으로 교체했다. Kinect 위치와 물리 화면 크기를 투영 계산에 연결한 덕분에 사용자가 옆으로 움직여도 모니터가 제자리에 있는 창처럼 보인다.
관광 콘텐츠 확장
2024 실감관광콘텐츠 경진대회 제출 영상.
나는 아이디어 논의와 시스템 구현에 참여하고 상호작용 기법을 선택한 근거를 수업 보고서로 정리했다. 팀은 이 결과물로 경진대회 최우수상을 받았다.
경진대회 현장 기록 보기
경진대회 현장에 설치한 Azure Kinect와 모션 패럴랙스 전시.
![]()
경진대회 현장에 참여한 5인 팀.
![]()
2024 실감관광콘텐츠 경진대회 최우수상 수상.
현재 한계
현재 구현은 센서와 모니터가 정해진 위치에 있다는 전제로 동작한다. 설치 각도와 위치를 자동으로 맞추는 과정이 없어 장비 배치가 달라지면 다시 조정해야 한다. Azure Kinect의 눈 관절도 실제 안구 위치를 정밀하게 측정한 값은 아니다.
입력부터 화면 갱신까지 걸리는 시간도 직접 측정하지 못했다. 다시 만든다면 센서와 화면을 맞추는 절차를 마련하고 추적 손실과 잡음, 전체 지연 시간을 측정한 뒤 사용자 실험으로 효과를 확인할 것이다.