Interaction SDK - 2024-Adoor/practice GitHub Wiki
๋ ๊ฐ์ง๊ฐ ์๋๋ฐ, OVRCameraRigInteraction๋ ์นด๋ฉ๋ผ ๋ฆฌ๊ทธ์ OVRInteractionComprehensive๋ฅผ ๋ชจ๋ ํฌํจํ๋ฉฐ ๊ถ์ฅ๋๋ ์ต์ ์ด๊ณ , ๋๋จธ์ง OVRInteractionComprehensive๋ ์ด๋ฏธ ์นด๋ฉ๋ผ๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
๐ ์ด ๋ถ๋ถ์ Set up Controllers as Hands๋ฅผ ๋ฐํ์ผ๋ก ํฉ๋๋ค.
์ปจํธ๋กค๋ฌ๊ฐ ์(controllers as hands๋ผ๊ณ ๋ ํจ) ์ญํ ์ ํ๋๋ก ์ํ์ง ์๋ ํ ์ด ์น์ ์ ์ ํ ์ฌํญ์ ๋๋ค. ์ปจํธ๋กค๋ฌ๊ฐ ์ ์ญํ ์ ํ๋ฉด ์ฑ์์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ์์ผ๋ก โโํ์๋ฉ๋๋ค. ์ด๋ ์์ ๋ชฐ์ ๋ ํฅ์๊ณผ ์ง๋ ๋ฐ ๋ฌผ๋ฆฌ์ ํผ๋๋ฐฑ๊ณผ ๊ฐ์ ์ปจํธ๋กค๋ฌ์ ์ด์ ์ ๊ฒฐํฉํฉ๋๋ค.
- ํ๋ก์ ํธ์์ OVRControllerHands๋ฅผ ๊ฒ์ํ์ธ์.
- ๊ฒ์ ๊ฒฐ๊ณผ์์ OVRControllerHands ํ๋ฆฌํน์ ๊ณ์ธต ๊ตฌ์กฐ์ OVRInteraction์ผ๋ก ๋๋๊ทธํฉ๋๋ค.
(OVRInteraction์ด ์ด๋์ ์๋์ง ํ์ธํ์ง ๋ชปํจ.) OVRCameraRigInteraction > OVRCameraRig > OVRInteractionComprehensive๋ฅผ ์ง์นญํ๋ ๋ฏํจ
Add an Interaction with QuickActions
QuickActions๋ ์ฌ์ ์ผ๋ถ ์ธํฐ๋์ ์ ์๋์ผ๋ก ์ถ๊ฐํ๋ v62 ์ด์์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ ๊ธฐ์กด ์ฌ ์ค๋ธ์ ํธ์ ์นด๋ฉ๋ผ ๋ฆฌ๊ทธ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ์ ์๋ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ ํด๋ฆญ ๋ง๋ฒ์ฌ ์ธํธ์ ํํ๋ฅผ ์ทจํฉ๋๋ค. QuickActions๋ ํ๋ก์ ํธ์ ์ธํฐ๋์ ์ ์ถ๊ฐํ๋ ๋ฐ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ฌ QuickActions๋ ์ก๊ธฐgrab, ๋ฉ๋ฆฌ ์ก๊ธฐdistance grab, ๊ด์ ray, ๋๋ฅด๊ธฐpoke ์ธํฐ๋์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ธํฐ๋์ ์ ์ถ๊ฐํ๋ ค๋ฉด ์ฌ์ด๋๋ฐ์ ํํ ๋ฆฌ์ผ ์น์ ์ ์ฐธ์กฐํ์ธ์.
ํด๋น ์ธํฐ๋์ ์ ํ์ํ ์ปดํฌ๋ํธ๋ ์นด๋ฉ๋ผ ๋ฆฌ๊ทธ์ GameObject์ ์๋์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค.
![]()
์๋์ผ๋ก ์ถ๊ฐ๋ GameObject๋ค.
https://developer.oculus.com/documentation/unity/unity-isdk-architectural-overview/
์ด ์ฃผ์ ์์๋ Interaction SDK๊ฐ ํธ๋ํน ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ตฌ์กฐํํ๊ณ , ์์ ํ์ฌ ์ธํฐ๋์ ์ ๋ง๋๋ ๊ณผ์ ์ ์ค๋ช ํฉ๋๋ค. Interaction SDK์์ ๋ชจ๋ ์ํธ์์ฉ์ ํค๋์ ์ ์นด๋ฉ๋ผ์ ์ปจํธ๋กค๋ฌ์์ ์ง์ ๊ฐ์ ธ์ค๋ ํค๋์ ์ ์๊ณผ ์ปจํธ๋กค๋ฌ์ ์์น ๋ฐ ํ์ ์ ๋ํ ์ ํํ ๋ฐ์ดํฐ์ ์์กดํฉ๋๋ค.
FromOVR...DataSource ์ปดํฌ๋ํธ์์ raw ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค. (...์๋ Body, Controller, Controller Hand, Hand, HMD๊ฐ ๋ค์ด๊ฐ ์ ์์)
raw ๋ฐ์ดํฐ๋ ๊ฐ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ FromOVR...Source ์ปดํฌ๋ํธ๋ก ์ด๋ํจ. ์ธํฐํ์ด์ค๋ IController, IHand, IHmd, IBody๊ฐ ์์
- Interactor: ์์ด๋ ์ปจํธ๋กค๋ฌ์ ๋ถ์ฐฉ๋์ด ํน์ ์ธํฐ๋์ (์ก๊ธฐ, ์ฐ๋ฅด๊ธฐ ๋ฑ)์ ๋ด๋นํ๋ ๊ฒ
- Interatable: ์ธํฐ๋์ ์ ๋ฐ๋ ์ค๋ธ์ ํธ(์: ์ก์ ์ ์๋ ๋ฌผ์ฒด)
Interactor๊ฐ ์๋ํ๋ ๋ฐฉ๋ฒ: ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ๊ณต๊ฐ์์ ์์ ์ ์์น๋ฅผ ํ์ธํ ๋ค์ ๊ทผ์ฒ์, ๊ฐ์ ์ธํฐ๋์ ์ ๋ด๋น(์: Ray Interactor๋ฉด Ray Interactable)ํ๋ Interactable์ ComputeCandidate() ๋ฉ์๋๋ก ์ฐพ์์ ์ ํํจ. IInteractor์ Drive() ๋ฉ์๋๊ฐ ComputeCandidate()๋ฅผ ์คํํด์ผ ํ๋ ์์ , ์ ํ์ด ๋ฐ์ํด์ผ ํ๋ ์์ , ์ ํ ์ค์ ํด์ผ ํ ์์ ๋ฑ๋ฑ์ ๊ฒฐ์ ํจ
Interactor์ Interactable์ด ์ด๋ํ ์ ์๋ ์ํ
Disabled <-> Normal <-> Hover <-> Select
FromOVR...Source ์์ ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด Interactor์์ ์ฌ์ฉํ ์ ์์. ํ์ง๋ง ์ ๋ฐ์ดํฐ๋ Interactor๋ก ๋ณด๋ด๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ ํ ์ ์๋ค.
์ ๋ฐ์ดํฐ์ ํ๋ ์ ์ฒ๋ฆฌ:
- ํ๋ค๋ฆผ์ ์ค์ด๊ฑฐ๋ ์ต์ํ.
- ๊ฐ์ ๋ฌผ์ฒด๋ฅผ ์ง์ ๋ ์๊ฐ๋ฝ์ ์์น๋ฅผ ์ค์ ์๊ฐ๋ฝ๊ณผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ
(์ค์ ์์ ์๋ฌด๊ฒ๋ ์ ์ก๊ณ ์์ง๋ง ๊ทธ๋ ๋ค๊ณ VR์์ ๋ฌผ์ฒด๋ฅผ ๋ซ๋๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉด ์๋๋๊น) - ์ค์ ์์ด๋ ์ปจํธ๋กค๋ฌ ๋์ ๊ฐ์์ ๊ธฐ๋ฐ์ผ๋ก ray interactor์ ์์ ์ ์คํ์
HandFilter๊ฐ์ IHand ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋๊ธฐ๊ณ ํด๋น ์ปดํฌ๋ํธ๋ฅผ FromOVR...Source ๋์ Interactor์๊ฒ ๋ฐ์ดํฐ ์์ค๋ก ์ฌ์ฉํ๋๋ก ํ๊ธฐ
HandRef๋ IHand ์ปดํฌ๋ํธ์ ๋ํ ๊ฒฝ์ ์ปดํฌ๋ํธ์ ๋๋ค. ๋ชจ๋ ์ธํฐ๋ํฐ ํ๋ฆฌํน์ ๋ฃจํธ GameObject๋ ๋ฃจํธ๊ฐ ํ์ ์ปดํฌ๋ํธ๋ค์ ์ฐ๊ฒฐํ ์ ์๋๋ก HandRef ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๋๋ค. ์ด ์์ ์ ์ฃผ์ ์ด์ ์ ์ธํฐ๋์ ํ๋ฆฌํน์ ์ฐ๊ฒฐํ๋ ๋ฐ ํ์ํ ์ฌ ๋ฐฐ์ ์ ์์ ์ต์ํํ๋ ๊ฒ์ ๋๋ค. OVRInput ํ๋ฆฌํน์ ์์ ์ธํฐ๋์ ํ๋ฆฌํน์์ ํ์ํ ๊ฐ ์ปดํฌ๋ํธ์ ์ฐ๊ฒฐํ๋ ๋์ ํ๋ฆฌํน์ ์ต์์ HandRef์ ๋จ ํ๋์ ์ฐ๊ฒฐ๋ง ์ค์ ํ๋ฉด ๋๋ฉฐ ํ๋ฆฌํน์ ๋ชจ๋ ํ์ ๊ฐ์ฒด๋ ํด๋น HandRef๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
ControllerRef๋ ์์ ๋น์ทํ๋ค
๋ฐ์ดํฐ๋ OVRPlugin์์ ์ฌ๋ฌ ํด๋์ค๋ฅผ ํตํด
Controller๋ฐHand์ ๊ฐ์ ์ ๋ ฅ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์ด๋ํ๋ฉฐ, ์ด๋ค ๋ชจ๋๋ ์ ๋ค๋ฆญ ๋ฒ ์ด์ค ํด๋์ค์ธ DataSource์ ํตํด IDataSource ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
IDataSource.InputDataAvailable: ์ธํฐํ์ด์ค์์ ๊ฐ์ฅ ์ค์ํ ํ๋๋ก, ์ปดํฌ๋ํธ๊ฐ ์
๋ฐ์ดํธ๋ ํธ๋ํน&์์น ๋ฐ์ดํฐ๋ฅผ ์ข
์์ฑ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
DataSource ํ์ ํด๋์ค๋ ์ง์ ๋ ํ์ (์: HandDataAsset)์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
DataModifier(์์ฒด๋ DataSource์์ ํ์๋จ)๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค. ์ฆ, HandDataAsset์์ ํ์ฒ๋ฆฌ๊ธฐ ์ญํ ์ ํฉ๋๋ค. DataModifier๋ DataSource์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ ๋ค์ IDataSource ์ธํฐํ์ด์ค๋ฅผ ํตํด ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
LastKnownGoodHand๋ ๋ง์ง๋ง์ผ๋ก ์๋ ค์ง ์ํธํ ํธ๋ ๋ฐ์ดํฐ๋ง ์์ ์ ์ฒด์ธ ์๋๋ก ์ ๋ฌํฉ๋๋ค. ๊ณต๊ธ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ์ด์ ๋ก๋ ์ ํจํ์ง ์๊ฒ ๋๋ ๊ฒฝ์ฐ(์ถ์ ์์ค, ๋ฎ์ ์ถ์ ํ์ง) ๋ง์ง๋ง์ผ๋ก ์ ํจํ ํธ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํฉ๋๋ค.
ํธ๋ ํธ๋ํนํ๋ ์ํ์์ ๋ดค์ ๋๋ ์์ ํ์คํธ ์นด๋ฉ๋ผ ๋ฐ์ผ๋ก ์์ง์ด๊ฑฐ๋ ์นด๋ฉ๋ผ์ ๊ฐ๊น์ด ๋๋ฉด ์์ด ๋ป์ ์์ธ๋ก ๋ฐ๋ก ์ด๋ํ๋๋ฐ ๊ทธ๋ฐ๊ฑฐ ๋ง์ ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
๊ทผ๋ฐ ์ด๊ฒ ์ปดํฌ๋ํธ ์ด๋ฆ์ธ์ง ๋ญ์ง...
์์ ๊ด์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์กฐ์
์๊ฐ๋ฝ์ด ๋ฌผ์ฒด๋ฅผ ์ก๋ ๋ฐฉ์์ด๋ ๋ฒํผ์ ๋๋ฅผ ๋ ๋ชจ๋ธ์ ํ์ด๋๊ฐ์ง ์๋๋ก ํ๋ ์ฐ๋ฅด๊ธฐ ์ ํ(poke limiting)์ ์ฌ์ฉ
InteractorVisual์ด๋ ๊ฒ์ด ์ด๊ฑธ ์ฌ์ฉํด์ ์กฐ์ ํ๋ ๊ฒ ๊ฐ์๋ฐ ์ฌ๋ฌ๊ฐ๊ฐ ํ๋ฒ์ ์กฐ์ ํ๋ ค๊ณ ํ๋ฉด ์๋๋ฏ๋ก InteractorGroup์ด ํ ๋ฒ์ ํ๋๋ง ์ํฅ์ ๋ฏธ์น๊ฒ ํด์ค๋ค๋ ๋ฏํจ
๐ ์ด ๋ถ๋ถ์ Interactor Interactable Lifecycle๋ฅผ ๋ฐํ์ผ๋ก ํฉ๋๋ค.
Interactor์ Interactable์ด ๊ฐ์ง ์ ์๋ Active State๋ค
| Interactor | Interactable | |
|---|---|---|
| Disabled | Interactor๊ฐ ๋นํ์ฑํ๋ ์ํ, ํธ๋ฒ๋ ์ ํ์ด ์ผ์ด๋์ง ์์ | Interactable์ด ๋นํ์ฑํ๋ ์ํ, ํธ๋ฒ๋ ์ ํ์ด ์ผ์ด๋์ง ์์ |
| Normal | ๊ธฐ๋ณธ ์ํ | ๊ธฐ๋ณธ ์ํ |
| Hover | Interactor๊ฐ ์ ํํ ์ ์๋ ์ํ (์ ํ์ Interactable์ด ์์ ์ ์์) | Interactable์ ํ๋ ์ด์์ Interactor๊ฐ ํธ๋ฒ๋งํ๊ณ ์์ผ๋ ์ ํ๋์ง ์์ ์ํ |
| Select | Interactor๊ฐ ์ ํ ์ค์ธ ์ํ (์ ํ์ Interactable์ด ์์ ์ ์์) | Interactable์ ์ ํํ๋ ํ๋ ์ด์์ Interactor๊ฐ ์๋ ์ํ |
๐ ์ด ๋ถ๋ถ์ InteractorGroups๋ฅผ ๋ฐํ์ผ๋ก ํฉ๋๋ค.
๊ธฐ๋ณธ InteractorGroup. ์ ํ ์์ฉ์ด ์๊ธฐ ์ ๊น์ง, ๋ ๋์ ์ฐ์ ์์์ Interactor๊ฐ ํธ๋ฒํ ์ ์๋ ์ํ๊ฐ ๋์ง ์๋ ํ, ํ์ฌ ํธ๋ฒ๋ง ์ค์ธ ๊ฐ์ฅ ๋์ ์ฐ์ ์์์ IInteractor๋ฅผ ํ์ฑ IInteractor๋ก ์ ์ง
์ ํ ์์ฉ์ด ์๋ค๋ฉด, ์ ํํ๋ IInteractor๋ ์ ํ์ด ๋๋ ๋ ๊น์ง ๋ณ๊ฒฝ๋์ง ์๋๋ค.
ICandidateComparer๋ฅผ IInteractor์ ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐ์ ์ธ ์ ์๋ค.
Select ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ IInteractor๋ฅผ ์กฐ์ ํ๋ ๋ฐ์ ์ฌ์ฉ.
InteractorGroup*๊ณผ ๋ฌ๋ฆฌ ์ ํ ์์ฉ์ด ์์ ๋๊น์ง ์ฌ๋ฌ IInteractor๊ฐ Hover ์ํ์ ์์ ์ ์์ต๋๋ค. ์ ํ ์์ฉ์ด ์๋ค๋ฉด, ์ ํํ๋ IInteractor๋ ์ ํ์ด ๋๋ ๋ ๊น์ง ๋ณ๊ฒฝ๋์ง ์๋๋ค.
*(InteractorGroup ์ด๊ฑฐ๋ ์๋ชป ์ ๋ ฅ๋์๊ฑฐ๋ ์์ด ์งค๋ฆฐ๊ฑฐ ๊ฐ์ ๋ฐ ๋ญํ๊ณ ๋ค๋ฅด๋ค๋ ๊ฑธ๊น์...)
๊ฐ์ฅ ์ฒ์ ํธ๋ฒ๋ง์ ์์ํ IInteractor๋ง ํ์ฑ ์ํ๋ก ์ ์งํ์ฌ ํด์ ๋ ๋๊น์ง ๋ค๋ฅธ IInteractor๊ฐ Hover ์ํ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
๋ ๊ฐ์ IInteractor๊ฐ ๋์์ ํธ๋ฒ ์์ํ๋ค๋ฉด? :๋ฆฌ์คํธ ์์ ๋๋ ICandidateComparer๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฐ์ ์์ ๋ถ์ฌ
๊ธฐ๋ณธ์ ์ผ๋ก InteractorGroups๋ ๋ฆฌ์คํธ ์ธ๋ฑ์ค ์์(์ฒซ ๋ฒ์งธ = ๊ฐ์ฅ ๋์ ์ฐ์ ์์)์ ๋ฐ๋ผ ์ฐ์ ์์๊ฐ ์ง์ ๋๋ค.
ICandidateComparer๋ฅผ ์ง์ ํด์ CandidateProperties์ ๋ฐ๋ผ ๋ค๋ฅธ ์์๋ก IInteractor์ ์ฐ์ ์์๋ฅผ ๋ฐ๊พธ๋๋ก ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, CandidateProperties๋ฅผ ICandidatePosition์ผ๋ก ์บ์คํ ํ ์ ์๋ IInteractor์ ๊ฒฝ์ฐ CandidatePositionComparer๋ผ๋ ๊ฒ์ ๊ณตํต ์์น๊น์ง์ ๊ฑฐ๋ฆฌ๋ก ์ธก์ ๋ ํ๋ณด ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก IInteractor์ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์ด๊ฑฐ๋ ์ง์ ์ฝ๋๋ฅผ ํ์ธํ์ง ์์ผ๋ฉด ๋ฌด์จ ์๋ฆฌ๋ฅผ ํ๋ ์ง ์ดํดํ๊ธฐ ํ๋ค๊ฒ ๊ฐ์ต๋๋ค.