1. Motion Parallax
(1) TV 화면 크기 계산
모션 패럴랙스 효과를 구현하려면 실제 TV 화면의 물리적 크기를 계산해야 한다. 화면 크기는 다음 공식을 통해 계산된다.
여기서 RD_m은 화면 크기(미터), RD_i는 화면 크기(인치)이다. 1인치 = 0.0254미터의 변환 계수를 사용한다. 이후 TV 화면의 폭과 높이는 종횡비(ar)를 고려해 계산된다.
예를 들어, 55인치 TV(16:9 비율)의 경우
- ar=16/9
이 값을 대입하면, RSw≈1.21미터와 RSh≈0.68미터가 된다. 이는 이후 가상 카메라 투영 평면을 TV 화면과 정확히 일치시키는 데 사용된다.
(2) 사용자 좌표 정규화
Kinect는 사용자 머리 위치()를 Kinect 센서 좌표계에서 추적한다. 이 좌표계의 원점(0, 0, 0)은 Kinect 센서의 물리적 위치에 위치하며, 센서가 설치된 TV의 화면 중심과 정확히 일치하지 않을 수 있다. 이를 보정하기 위해 다음과 같은 절차를 수행한다.
- TV 화면 높이 RSh: TV 화면의 물리적 높이는 화면의 중심을 기준으로 절반씩 나뉜다. RSh/2는 화면 중심에서 위 또는 아래로 이동해야 할 거리를 나타낸다.
- 보정 작업: Etracked는 Kinect 센서 좌표계에서의 사용자 머리 위치이므로, TV 화면 중심을 기준으로 위치를 조정하려면 RSh/2를 추가하여 Kinect 좌표계와 TV 좌표계를 일치시킨다.
위 식의 의미는 Kinect 좌표계에서 얻은 사용자 머리 위치가 TV 화면 중심을 기준으로 상단이나 하단으로 얼마나 이동해야 하는지를 보정하는 것이다.
다음 단계는 보정된 머리 위치를 화면 공간(screen space) 좌표계로 변환하는 것이다. 화면 공간 좌표계는 TV 화면을 기준으로 정규화된 좌표계로, 다음과 같은 장점이 있다:
- 화면의 물리적 크기(폭과 높이)에 상관없이 일관된 좌표계를 제공한다.
- 가상 객체를 화면 공간과 일치시키기 쉬워진다.
머리 위치를 화면 폭(RSw)으로 나누는 이유는 다음과 같다:
- 비율 계산: 화면 공간 좌표계에서는 TV 화면의 폭이 로 정규화된다. 따라서 머리 위치를 화면 폭으로 나누면 사용자의 가로 위치가 TV 화면에서 차지하는 비율로 표현된다.
- 3D 환경 통합: Unity와 같은 3D 엔진에서 가상 카메라의 투영 평면은 정규화된 좌표계를 사용하므로, REwc로 나눠 화면 공간 좌표계(REsc)로 변환해야 가상 객체와 실제 화면 간의 일치를 보장할 수 있다
(3) 가상 카메라 이동 및 투영 평면 왜곡
가상 카메라 이동 및 투영 평면 왜곡은 모션 패럴랙스 효과를 구현하는 핵심 과정이다. 이를 통해 사용자의 머리 위치에 따라 가상 카메라가 이동하며, 화면의 3D 객체가 자연스럽게 사용자의 시점에서 보이도록 만든다. 이 과정은 크게 가상 카메라 이동 계산과 투영 평면 왜곡으로 나뉜다.
가상 화면 크기 계산
가상 카메라의 투영 평면(Frustum) 경계값을 이용해 가상 화면의 폭(VSw)과 높이(VSh)를 계산한다. 이 값은 Frustum의 오른쪽(Fr)과 왼쪽(Fl), 상단(Ft)과 하단(Fb) 경계의 차이를 통해 얻어진다.
예를 들어, 가상 카메라의 Frustum 경계가 Fr = 0.5, Fl = - 0.5, Ft = 0.5, Fb = -0.5 라면:
이는 가상 화면의 폭과 높이가 각각 1.0임을 나타낸다.
가상 카메라 초기 위치 계산
가상 카메라의 초기 위치는 Frustum의 중심점으로 설정된다. 이 위치는 다음 공식을 사용하여 계산된다:
여기서 FnFn은 Frustum의 near plane 거리다. 예를 들어
가상 화면 공간 좌표로 변환
상 카메라 위치를 화면의 폭과 높이로 나누어 화면 공간 좌표(VEscVEsc)로 변환한다. 이는 다음과 같이 계산된다:
사용자 머리 위치와 비교
먼저, 카메라 이동을 계산하기 위해 이동 벡터(Tvector)를 구한다. 이동 벡터는 화면 공간 좌표계에서 사용자의 머리 위치(REsc)와 카메라의 초기 위치(VEsc) 간의 차이로 정의된다. 이는 다음과 같이 계산된다.
예를 들어, 사용자의 머리 위치가 REsc=(0,0,0.83)이고, 가상 카메라의 초기 위치가 VEsc=(0,0,1.0)라면, 이동 벡터는 Tvector=(0,0,−0.17)로 계산된다. 이는 카메라가 사용자 머리 위치로 이동하기 위해 Z축 방향으로 0.17미터를 이동해야 함을 의미한다.
다음으로, 계산된 이동 벡터를 이용해 가상 카메라를 이동시킨다. 카메라 이동 이후에는 투영 평면의 경계를 조정해야 한다. 카메라가 이동함에 따라 투영 평면(near plane)의 위치도 왜곡되어야 TV 화면과 가상 객체의 시각적 정렬이 유지된다. 새로운 투영 평면 경계(DF)는 기존 경계(F)에서 이동 벡터(Tvector)를 뺀 값으로 계산된다:
예를 들어, 기존 투영 평면 경계가 left=−0.5,right=0.5,top=0.5,bottom=−0.5,near=1.0left = -0.5, right = 0.5, top = 0.5, bottom = -0.5, near = 1.0이고, 이동 벡터가 Tvector=(0,0,−0.17)T_{vector} = (0, 0, -0.17)라면, 새로운 투영 평면 경계는 near′=near−Tvector.z=1.0−(−0.17)=1.17near' = near - T_{vector.z} = 1.0 - (-0.17) = 1.17로 조정된다. 다른 경계 값은 이동 벡터의 X와 Y 성분이 0이므로 변경되지 않는다. 이를 통해 투영 평면은 Z축 방향으로 더 멀리 이동하여 사용자의 새로운 시점에 맞춰진다.
결과적으로, 가상 카메라의 위치와 투영 평면이 사용자 머리 위치에 따라 실시간으로 조정되면서 화면에 표시되는 3D 객체는 항상 사용자 관점에서 자연스럽게 보인다. 이러한 과정은 모션 패럴랙스 효과의 핵심 원리로, 사용자와 화면 간의 몰입감 있는 상호작용을 가능하게 한다.
Gestural Interaction (제스처 상호작용)
1) Visual Pinpoint Attraction (시각적 포인팅 흡인)
이 제스처는 사용자가 화면의 3D 객체를 손으로 가리키고 가까이 다가갈 때, 해당 객체가 사용자 쪽으로 끌려오는 "흡인 효과"를 구현한다.
구현 절차
- 손끝 위치 추출: Kinect의 스켈레톤 데이터를 이용해 사용자의 손끝 위치를 추출한다.
- 좌표 변환: 추출된 손끝 위치를 왜곡된 카메라 뷰포트의 좌표계로 변환한다. 이 과정은 사용자가 보는 시점에서 화면의 3D 객체와 손끝 간의 정확한 위치 관계를 보장하기 위해 필요하다.
- 3D 객체의 좌표 변환: 가상 객체의 3D 좌표도 동일한 카메라 뷰포트 좌표계로 변환한다. 이 변환을 통해 객체가 Z축에서 다른 깊이에 있더라도, 사용자 시점에서 같은 X, Y 위치에 있으면 상호작용 대상이 될 수 있다.
- 거리 계산: 변환된 손끝 위치와 객체 위치 사이의 거리를 계산한다. 이 거리가 최소 상호작용 거리(MiMi) 이하일 경우 객체와의 상호작용이 시작된다. 최소 상호작용 거리는 보통 10cm로 설정된다.
- 흡인 파라미터 TpT_p 계산: 거리(DD)와 최소 상호작용 거리(MiMi)를 사용해 TpT_p 값을 계산한다. TpT_p는 0에서 1 사이의 값으로, 객체가 사용자에게 얼마나 가까이 끌려오는지를 나타낸다. 계산 공식은 다음과 같다:
- : 흡인 파라미터.
- DD: 사용자 손끝과 객체 사이의 거리.
- MiMi: 최소 상호작용 거리.
- 경우, 객체는 사용자와의 중간 위치까지 끌려온다.
- T 값에 따른 객체 이동:
- TpT_p 값이 증가할수록 객체는 사용자 쪽으로 이동한다.
- 사용자가 손을 객체에서 멀리 움직이면 TpT_p 값이 감소하며, 객체는 원래 위치로 되돌아간다.
- 양손 상호작용: 이 과정은 화면에 표시된 모든 가상 객체와 사용자 양손에 대해 독립적으로 적용된다.
2) Back Gesture (뒤로가기 제스처)
이 제스처는 사용자가 특정 메뉴를 선택한 후 홈 메뉴로 돌아가기 위해 사용된다. Kinect가 사용자의 손 동작을 추적하며, "오른쪽으로 손을 휘두르는 동작"을 인식하여 동작을 트리거한다.
구현 절차
- 손 움직임 속도 및 방향 측정: Kinect는 사용자의 손 움직임 속도를 계산한다. 움직임의 속도와 방향을 분석하여 제스처를 인식한다.
- 속도 임계값 설정:
- 속도가 1.5m/s 이상이면 해당 동작을 제스처로 간주한다.
- 이 값은 너무 느린 동작(무의식적인 움직임)과 너무 빠른 동작(사용자가 제어하기 어려운 속도)을 구분하기 위해 선택되었다.
- 방향 확인:
- 움직임이 왼쪽에서 오른쪽으로 진행되면 뒤로가기 제스처로 간주한다.
- 방향은 손의 초기 위치와 최종 위치의 X 좌표를 비교하여 결정된다.
- 제스처 인식 및 실행:
- 속도가 임계값 이상이고 방향이 오른쪽으로 확인되면, 뒤로가기 동작이 실행된다.
- Kinect는 거실 내 어디에서든 이 동작을 인식할 수 있다.