Grabbable
VR/Oculus Integration 2023. 12. 18. 11:11
https://youtube.com/playlist?list=PLTFRwWXfOIYB9hru6EjeVS0E-4jNiOuQQ&si=zoJ3NoYX6YrGnpg1
Unity VR with Oculus Integration 57.0
Unity VR with Oculus Integration
www.youtube.com
Grabbable 구성 요소는 상호 작용할 때 GameObject를 회전, 크기 조정 또는 변형시키는 것입니다.
GameObject의 회전, 크기 조정 또는 변형 방법을 결정하기 위해 Grabbable은 Transformer 구성 요소를 사용합니다.
Transformer 구성 요소는 One Hand Grab Transformer(한 손만 필요)와 Two Hand Grab Transformer(양손 필요)의 두 가지 주요 범주로 나뉩니다.
![](https://blog.kakaocdn.net/dn/cZ5nkc/btsB2P3r5Q2/ICtmfuFEqB3aQGskTRUQU0/img.png)
OnEnable()을 호출하려면 먼저 Forward Element 속성을 설정해야 합니다.
Transfer on Second Selection
이 옵션을 선택하면 한 손으로 물체를 잡은 다음 다른 손으로 잡는 경우 원래 손이 강제로 물체를 놓게 됩니다.
![](https://blog.kakaocdn.net/dn/TbrYl/btsB2PCnrqS/OGgM7IbDjyQCRmxxxpECek/img.png)
Add New Points to Front
이 옵션을 선택하면 개체를 잡을 때 해당 손의 Vector3 포인트가 Vector3 포인트 목록의 끝이 아닌 시작 부분에 추가됩니다.
이 속성은 매우 독특한 사용 사례를 가지므로 대부분의 경우 두 번째 선택 시 전송 속성을 대신 사용해야 합니다.
![](https://blog.kakaocdn.net/dn/cjGJEh/btsB6m7itmv/psD5G39znw3l6iJOSAF6t0/img.png)
Max Grab Points
최대 잡기 포인트 수입니다. -1(무제한), 1 또는 2일 수 있습니다.
![](https://blog.kakaocdn.net/dn/dbnLt3/btsB6hEQxqn/wi8IKvDS6ko3pSJqKfMxaK/img.png)
Forward Element (optional)
이벤트가 이 요소로 전달됩니다. 여러 PointableElement를 함께 연결하는 데 사용할 수 있습니다.
![](https://blog.kakaocdn.net/dn/vsDJz/btsB4SFHHXf/aRsFhUU83bgcXX8xZkif01/img.png)
One Grab Transformer (optional)
잡을 수 있는 개체에 연결해야 하는 One Grab...Transformer 구성 요소입니다.
기본값은 One Grab Free Transformer입니다.
Two Grab Transformer 속성을 설정했지만 여전히 한 손으로 잡기를 원하는 경우 이 속성도 설정해야 합니다.
![](https://blog.kakaocdn.net/dn/nAClw/btsB7kVxPdc/emPjpIAtuOyQOxZX9BbjZK/img.png)
Two Grab Transformer (optional)
잡을 수 있는 개체에 연결해야 하는 Two Grab...Transformer 구성 요소입니다.
이 속성을 설정했지만 한 손으로 잡기를 원하는 경우 One Grab Transformer 속성을 설정해야 합니다.
![](https://blog.kakaocdn.net/dn/63fNm/btsB82mnxXe/UcSI3L2nkkCfwQjVdUG100/img.png)
Target Transform (optional)
Grabbable 구성 요소가 있는 개체를 변환하는 대신 변환할 대상 개체를 사용합니다.
Grabbable 구성 요소가 있는 개체는 변환을 대상 개체에 투영하는 컨트롤러 역할을 합니다.
![](https://blog.kakaocdn.net/dn/ojY2v/btsCav21Vq5/N782M6dWr6N4MPzIIepo90/img.png)
One Grab Transformers
Grabbable 구성 요소의 One Grab Transformer 속성에 One Grab Transformer 구성 요소를 할당해야 합니다.
One Grab Transformer의 종류는 다음 4가지가 있음
![](https://blog.kakaocdn.net/dn/oHja6/btsB7bc3J0h/1i47pbSsZDqAyZS8NYpN5K/img.png)
OneGrabFreeTransformer
Pointable 이벤트를 사용하여 Grabbable의 위치와 회전을 일대일로 업데이트합니다.
이는 Grabbable에 할당된 기본 Transformer 동작입니다.
OneGrabTranslateTransformer
Grabbable의 위치만 업데이트합니다(선택적 제약 조건 포함).
Interactable 구조
![](https://blog.kakaocdn.net/dn/clwFgl/btsB6NXZwBr/EqAiQQGfwNT9WJc7ATAXOK/img.png)
최상위 오브젝트 Pin01에는 Grabbable, Rigidbody, One Grab Translate Transformer 컴포넌트 부착
![](https://blog.kakaocdn.net/dn/N59WF/btsB7VumOhD/9Uf9DWwdWWOpYdWsk4NJE1/img.png)
Constraints 프로퍼티를 이용해 이동 제한 하기
![](https://blog.kakaocdn.net/dn/cPqDv0/btsB7mFLBh5/sAXNi1MpAjJ0F8fyQ3eEZ0/img.png)
![](https://blog.kakaocdn.net/dn/bqkrPO/btsB6NXZw7I/uk1c5IvcOQlXfgPWsliHfK/img.png)
다음은 자식 오브젝트 GrabInteractable
![](https://blog.kakaocdn.net/dn/lhxye/btsB6LsetJS/R7tTRieptzsycuxZbYVV7K/img.png)
GrabInteractable 컴포넌트 부착 (컨트롤러)
![](https://blog.kakaocdn.net/dn/YLI8O/btsB7dvaQdK/RIl3HKuTzAWqlpoVc7mtF1/img.png)
자식으로 Hands 또는 Controller as Hands 일경우 HandGrabInteractable컴포넌트 부착
![](https://blog.kakaocdn.net/dn/qCSwq/btsB6Mko44m/UkS0cgDgOW5i8y6SmMfuA1/img.png)
![](https://blog.kakaocdn.net/dn/cddwu0/btsCc3ZuMMO/ZrYVKn5KhkKadlDHSE4CJK/img.png)
자식으로 PinMesh (실제 비주얼)
![](https://blog.kakaocdn.net/dn/bUoz8i/btsCaxNjuhf/uZ9oPQPb5rrwdUKZjlRoJ0/img.png)
다음 컴포넌트 부착
Mesh Filter
Mesh Renderer
Mesh Collider
Interactable Color Visual
Material Property Block Editor
Interactable Group View
![](https://blog.kakaocdn.net/dn/bXVkhw/btsCavBXvOy/saCen2RkPRthwKVZ8eQaHK/img.png)
Interactable Color Visual 컴포넌트에서 선택시 색상을 변경하는 역할을 함 (디버깅 용도로 사용해도 좋을듯)
![](https://blog.kakaocdn.net/dn/bc5ZmT/btsB84EttHV/V8hvT780zgkE0qlSOqCzCK/img.png)
OneGrabRotateTransformer
주어진 축을 중심으로 Grabbable의 회전만 업데이트합니다(선택적 제약 조건 포함).
![](https://blog.kakaocdn.net/dn/lPwDA/btsB6kaVO2I/SShuq6dA3oKxhNONNRsffk/img.png)
![](https://blog.kakaocdn.net/dn/bUjisJ/btsB6PaPZkU/kmUkIFWCt59a8YtIuvz5nK/img.png)
Box는 빈오브젝트
![](https://blog.kakaocdn.net/dn/mSLm3/btsB6vXyy4V/L6Q1zksUQNKF0tdLU7DpcK/img.png)
BoxBase는 아래쪽 메쉬
![](https://blog.kakaocdn.net/dn/bCQvEq/btsB7dWDTjW/m1Jdk89TobRWth7IWznpTk/img.png)
![](https://blog.kakaocdn.net/dn/ctQwpn/btsB8TXQQHu/Q1AdcbAs8nHy8Im6F2IUk0/img.png)
Hinge는 빈오브젝트 Rigdbody만 붙어 있음
![](https://blog.kakaocdn.net/dn/1iJPG/btsB7euu1qD/THyRKL2wkzIK84cGHj5421/img.png)
![](https://blog.kakaocdn.net/dn/cjGBYq/btsCfzRRQWi/SHKlH2KmAm72dDMakQJt4K/img.png)
![](https://blog.kakaocdn.net/dn/AILrG/btsCbe8hSvU/4SFc9RjATzN25vrnTtfsTk/img.png)
자식으로 빈오브젝트 BoxLid
![](https://blog.kakaocdn.net/dn/cunUz9/btsB6t6vNKD/RKD0quRfZHxnmiPRb6gO8K/img.png)
컴포넌트 부착
Grabbable, Rigidbody
One Grab Rotate Transformer
Mesh Filter , Mesh Renderer
Material Property Block Editor, Interactable Color Visual, Interactable Group View
![](https://blog.kakaocdn.net/dn/vhHRL/btsCf4KOEXk/75VWKWkN3Nhgim22rgFYe0/img.png)
Grabbable
![](https://blog.kakaocdn.net/dn/zFrGr/btsB7geLmfd/kRT4kkqNG0hjD07YerUYj1/img.png)
One Grab Rotate Transformer
![](https://blog.kakaocdn.net/dn/rkZBK/btsB7jQgPVj/ZyeO5PqfLZsaim66sqLfbK/img.png)
Rigidbody
![](https://blog.kakaocdn.net/dn/byWa9b/btsCfZisFwZ/O4bRcc3zGzFKnryWlIOIJ1/img.png)
Mesh Filter
![](https://blog.kakaocdn.net/dn/m5R9d/btsCfzYBfz4/h62IRHgpHL7Pl93V5un4wk/img.png)
![](https://blog.kakaocdn.net/dn/0OrrL/btsB5F7vgUF/nLVix7n9XlWBlo5gnGUVs1/img.png)
Mesh Renderer
![](https://blog.kakaocdn.net/dn/bkdRXa/btsCbeUM15E/h4AKkr3V3BMIESWJMlW96k/img.png)
Mesh Collider
![](https://blog.kakaocdn.net/dn/daEYwr/btsB8SLql56/64p8U28kf0fsz8q8B6tHvK/img.png)
Material Property Block Editor
![](https://blog.kakaocdn.net/dn/QvHbP/btsCevWf5sb/KtOAFZctSxKNgum02UcjZk/img.png)
Interactable Color Visual
![](https://blog.kakaocdn.net/dn/1p3gv/btsB84dPGsa/zmvaxWbpdmJRA2PIajZc00/img.png)
Interactable Group View
![](https://blog.kakaocdn.net/dn/3PicA/btsCew1VI0E/eKmbWPhdkhq3Dpvf4PSrvK/img.png)
![](https://blog.kakaocdn.net/dn/pH39S/btsB7lN4I4k/VnEJlcWviwRdkvAlJJdN91/img.png)
GrabInteractable
![](https://blog.kakaocdn.net/dn/A1Yda/btsCgrluXvH/IXKftCORsTA0CThcpkuSB1/img.png)
HandGrabInteractable
![](https://blog.kakaocdn.net/dn/eBKaW3/btsB81VIm96/jeHLJtyTHjkdMwZyXWC5IK/img.png)
Audio
![](https://blog.kakaocdn.net/dn/bTVzdI/btsCezj2jyZ/l1P9t7kQfdZlBFLbY0aai1/img.png)
ComplexGrabBoxGrabAudio
![](https://blog.kakaocdn.net/dn/bhJP8W/btsCfZitbiC/YtF5G5qHch8ifi7qETYvaK/img.png)
ComplexGrabBoxReleaseAudio
![](https://blog.kakaocdn.net/dn/cKec6F/btsB5Gk1Nsb/HKcLKjyqHukzKAvkru9Kr1/img.png)
ComplexGrabBoxOpenClose
![](https://blog.kakaocdn.net/dn/b0ekuI/btsB8UWMdh5/Osuyh4egE13GxMCAZMjLsK/img.png)
OneGrabPhysicsJointTransformer
이 변환기는 Grabbable이 변환 중에 환경과 계속 충돌(비운동학적)해야 하는 물리적 개체일 때 유용합니다.
또는 잡을 수 있는 물리 문이나 레버의 경우에서 흔히 볼 수 있는 것처럼 물리 조인트를 통해 환경에 부착되는 경우도 있습니다.
옵션인 ConfigurableJoint를 사용하면 관련 없는 모션을 Free로 설정하고 사전 처리와 같은 다른 기능을 사용할 수 있습니다. 이는 사용자 정의 동작을 생성하는 데 도움이 되고 가끔 발생하는 물리적 결함을 제거할 수 있습니다. 이 선택적 ConfigurableJoint는 런타임 중에 복사되므로 비활성화된 GameObject에 배치해야 합니다.
조인트에 대한 참고 영상
https://www.youtube.com/watch?v=MElbAwhMvTc
Cube를 하나 만들고
![](https://blog.kakaocdn.net/dn/3e9yP/btsB5Hddh0b/klHRn2B8jABzoF5ghNtMs1/img.png)
리지드바디를 추가 하고 Is Kinematic을 체크 합니다
이제 내가 직접 옮기는것 이외 다른 강체로 인해 Cube는 이동 할수 없습니다.
![](https://blog.kakaocdn.net/dn/UITLF/btsCaup2Hf3/f8qxRm0uC05cKpcMS7jkb1/img.png)
Cube를 복사 하고
![](https://blog.kakaocdn.net/dn/ddTZel/btsB7SxYDKF/kkLbX6COiy4qFH1ZuGk5e0/img.png)
Is Kinematic을 해제 합니다
![](https://blog.kakaocdn.net/dn/PcIWl/btsCgv2wfI1/uBElBBmKUKA1ke7uUYzNj1/img.png)
이어서 고정 조인트 컴포넌트를 추가 합니다
![](https://blog.kakaocdn.net/dn/bOZMLb/btsB7Uv0VVr/5HM3Tex3x0dmYzmBIe3m80/img.png)
처음에 만든 Cube의 이름을 연결된 강체로 바꿔줍니다
![](https://blog.kakaocdn.net/dn/QmXVt/btsB6jpypcH/8okAMzfyWlRcw8ny3HoYYk/img.png)
두번째 큐브를 선택하고 Fixed Joint 컴포넌트의 Connected Body 프로퍼티에 넣어 줍니다.
![](https://blog.kakaocdn.net/dn/bJqyHf/btsB6kBZ3V1/0mC8nCz2x2LGDCCkvUOGY1/img.png)
3번째 큐브를 만들고
![](https://blog.kakaocdn.net/dn/bxhkMr/btsB6NKXJ9Q/lEg3P2pXIMOPrJC4Rrnl1k/img.png)
Rigidbody를 부착후 Use Gravity를 체크 해제 합니다
![](https://blog.kakaocdn.net/dn/drIwuR/btsB8U3DsRS/k4aarWIseKSRci6aYBx5o0/img.png)
![](https://blog.kakaocdn.net/dn/CWddA/btsB8V2xTaW/qlwT9TlUKtmzXGJgM7xBn0/img.png)
두번째 큐브를 선택하고
![](https://blog.kakaocdn.net/dn/bRJcT6/btsB8SSix52/kb0kmkChkmk8roo36g5nAk/img.png)
Fixed Joint 컴포넌트의 Break Force 와 Break Torque 프로퍼티의 값을 10으로 설정한뒤
![](https://blog.kakaocdn.net/dn/oyMwB/btsCawnRQJy/aN75Okk0jeKAu3M7MSW7kK/img.png)
플레이 하고 3번째 큐브로 충돌을 일으켜 보면 2번째 큐브가 분리 되는것을 확인 할수 있습니다.
![](https://blog.kakaocdn.net/dn/ciyYSz/btsB5D2WhIT/LtzBemourBuyLuQsKPVH40/img.gif)
두번째 큐브를 선택하고 Fixed Joint를 제거 후
![](https://blog.kakaocdn.net/dn/w49q7/btsB5FfoTTl/4dMDe8hncMsmspT7DGY7fk/img.png)
Spring Joint컴포넌트를 부착 합니다
![](https://blog.kakaocdn.net/dn/bE9qat/btsCc4ED0Zr/EDnGCcbkIVO8deZUKZlvdk/img.png)
연결된 바디를 설정후
![](https://blog.kakaocdn.net/dn/bLSOfX/btsCf3FdVEP/THKA0MEMsZaoUkkeuPskFk/img.png)
스크링 수치를 높게 하고 실행 하면
![](https://blog.kakaocdn.net/dn/ug2F3/btsCgsx0sKt/Aw8eaBCCuxwbgegbYI4R11/img.png)
![](https://blog.kakaocdn.net/dn/qtxdR/btsB7VBGP0K/9NIB22vS0SDkMgVvlyadVK/img.gif)
두번째 큐브를 선택하고 Spring Joint를 제거후 Hinge Joint컴포넌트를 부착 합니다
![](https://blog.kakaocdn.net/dn/bvGicf/btsCf2l2b27/syCi01cNtJnxUZuuu8MxA1/img.png)
![](https://blog.kakaocdn.net/dn/cmWFMC/btsCfCVoDcs/asQTTKTdGpKLj78MdtJuMK/img.png)
![](https://blog.kakaocdn.net/dn/n7q1l/btsB6PaWlei/OlsLUoV5l6YKoNK8H7SkM1/img.gif)
연결된 강체를 통해 함께 이동 할수도 있습니다.
![](https://blog.kakaocdn.net/dn/bMu8O4/btsB82G925o/DHtaYksXC6xgjuYEijgdW0/img.gif)
Unity Tutorial - Configurable Joint Hang Man
![](https://blog.kakaocdn.net/dn/bLHesf/btsB6LNk19J/sWLCJvlKHS3xwNL1seVC5k/img.png)
리소스
책상과 서랍
https://assetstore.unity.com/packages/3d/pbr-georgian-desk-and-chair-90192
문
https://assetstore.unity.com/packages/3d/props/metal-door-5397
참고
https://docs.unity3d.com/kr/2022.1/Manual/class-ConfigurableJoint.html
https://docs.unity3d.com/Manual/class-ConfigurableJoint.html
https://www.youtube.com/watch?v=cx2aGKdbyhU
https://developer.oculus.com/documentation/unity/unity-isdk-grabbable/
'VR > Oculus Integration' 카테고리의 다른 글
OneGrabPhysicsJointTransformer (0) | 2023.12.20 |
---|---|
Grabbable (Two Grab Transformers) (0) | 2023.12.19 |
FingerFeatureStateThresholds (0) | 2023.12.14 |
Unity VR Build a Custom Hand Pose (Oculus Integration SDK) (0) | 2023.12.14 |
Create Snap Interactions (0) | 2023.12.12 |