Hand Interaction Examples
핸드로 할 수 있는 다양한 상호작용을 할 수 있음
누르기, 터치, 잡기, 스크롤, 무브, 스케일 등등
스케일 무브 로테이션은 Hand Coaching 에서 했기 때문에 스킵하겠음
-------
Press 누르기
누르기 버튼은 이런 스크립터로 되어있음
먼저 PressableButton 으로 움직이는 버튼을 넣어주고
PhysicalPressEventRouter에 있는 이벤트로 터치가 되면 이벤트
끝나면 이벤트를 만들어주고 있다.
Interactable 스크립터를 달아줘서
인터렉티브를 작동하게 하고
가까이서 누를수 있게 NearInteractionTouchable 스크립터를 달아준다.
-----
Press Piano
위와 크게 다르지 않음
먼저
PressableButton 스크립터를 달아줘서
Moving Button Visauls 에 움직이는 오브젝트를 넣어준다.
버튼이 눌러졌을때 반응하는 이벤트들을 넣어준다.
(이번에는 특이하게 Debug 로그를 찍는 것을 볼 수 있다.)
가까이서 터치하기 때문에 NearIntercationTouchable 스크립터를 달아준다.
Interactable 스크립터를 달아줘서
상호작용이 일어날때 작동하게 해주고,
Profiles (전에 풍선 할 떄 ㅊ럼)에서 Theme를 넣어줘서
누를때 (상호작용 )마다 색이 변하게 해준다.
-----
Touch Interaction
터치를 하면 로테이션이 되게함
NearInteractionTouchable은 가까이 있는 것에 대한 터치임
핵심은
데모씬에서 만들어둔
HandInteractionTouchRoate 임
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using Microsoft.MixedReality.Toolkit.Input;
using UnityEngine;
using UnityEngine.Serialization;
namespace Microsoft.MixedReality.Toolkit.Examples.Demos
{
[AddComponentMenu("Scripts/MRTK/Examples/HandInteractionTouchRotate")]
public class HandInteractionTouchRotate : HandInteractionTouch, IMixedRealityTouchHandler
{
[SerializeField]
[FormerlySerializedAs("TargetObjectTransform")]
private Transform targetObjectTransform = null;
[SerializeField]
private float rotateSpeed = 300.0f;
void IMixedRealityTouchHandler.OnTouchUpdated(HandTrackingInputEventData eventData)
{
if (targetObjectTransform != null)
{
targetObjectTransform.Rotate(Vector3.up * (rotateSpeed * Time.deltaTime));
}
}
}
}
ImixedRealityTouchHandler. OnTouchUpdated 를 쓰면
터치를 했을 때 반응이 들어온다.
밖에서도 뚫어지고
안에서도
구현 해 줄 수도 있따 .
----
Pinch Slider 사용해서 색깔 바꿔주기
핵심은 PinchSlider 스크립터임
움직이는 것은 Thumb Root에 넣어주기
1. Track Visuals 은 트랙 (길) 슬라이더가 움직이는 길목 오브젝트를 넣어준다.
2. Tick Marks //
움직일수 있는 범위?
3.SliderButton // 움직이는 버튼을 넣어준다.
SliderAxis 는 슬라이더가 움직이는 축을 설정해주는 것
이벤트를 넣어준다.
OnValueUpdated는 Value값이 달라 질때 마다 호출되는 것 인듯
Platonic 에 있는 SliderChageColor 스크립터에 Target Renderer로 받는 것의 메쉬 렌더의 컬러 값을
슬라이더의 밸류값과 연동시키는 주는 듯
-------
Manipulation Interaction
객체 조작하기
기본적으로 물체를 움직이기 위한
ObjectManipulator 스크립터가 들어가 있고
그랩을 위한
NearlnteractionGrabbable 스크립터도 달려있음
한 손으로 잡고 고정을 시키고 로테이션
CusorContextObjectManipulator 스크립터는
커서를 (시선) 가져다 댔을때 나오는 아이콘 또는 커서를 의미한다.
모양도 바꿔줄수있다.
한손으로만 할려면
원핸드 온리로 해주면 된다.
ConstraintManager 스크립터로 Constraint 추가햐면된다
----
바닥에 놓은 물체 // 원래 위치에서 일정 위치 벗어나면 다시 생성되게 함
기본적으로 바닥에
Collider와 RigidBody를 붙여주고 // 바닥의 리지드 바디는 Is Kinematic으로 바꿔준다.
떨어지는 오브젝트에도 리지드바디와 BoxCollider를 넣어준다.
오브젝트에는
이러한 스크립터가 붙었다.
NearInteractionGrabbable 은 그랩을 하기 위해서 붙여주고
CursorContextObjectManipulator 와 CursorCOntextInfo 는 커서 떄문에 넣은 것 같고
Constraint Manager는
제약조건? 를 주기 위함
여기서 또다른 핵심은
TetheredPlacement 라는 스크립터인데 이건 샘플씬에서 만들어둔 스크립터 이긴하나
유용하기 때문에 뜯어 볼 것이다.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using UnityEngine;
namespace Microsoft.MixedReality.Toolkit.Examples.Demos
{
/// <summary>
/// Helper script to respawn objects if they go too far from their original position. Useful for objects that will fall forever etc.
/// </summary>
[AddComponentMenu("Scripts/MRTK/Examples/TetheredPlacement")]
public class TetheredPlacement : MonoBehaviour
{
[Tooltip("The distance from the GameObject's spawn position at which will trigger a respawn ")]
public float DistanceThreshold = 20.0f;
private Vector3 RespawnPoint;
private Quaternion RespawnOrientation;
private Rigidbody rigidBody;
private void Start()
{
rigidBody = GetComponent<Rigidbody>();
LockSpawnPoint();
}
private void LateUpdate()
{
float distanceSqr = (RespawnPoint - this.transform.position).sqrMagnitude;
if (distanceSqr > DistanceThreshold * DistanceThreshold)
{
// Reset any velocity from falling or moving when respawning to original location
if (rigidBody != null)
{
rigidBody.velocity = Vector3.zero;
rigidBody.angularVelocity = Vector3.zero;
}
this.transform.SetPositionAndRotation(RespawnPoint, RespawnOrientation);
}
}
public void LockSpawnPoint()
{
RespawnPoint = this.transform.position;
RespawnOrientation = this.transform.rotation;
}
}
}
코드는 길진 않지만,
먼저 Vector3 로 리스판포인트와 쿼터니언으로 로테이션값을 가지고,
업데이트 문으로 위치가 현재 위치값이 스판 포인트와 차이가 클때,
trasform.SetPositionAndRotation 메서드롤 써서 다시 위치 시켜준다.
------
'AR Glasses > Hololens2' 카테고리의 다른 글
[MRTK 기능 공부] ScrollingObjectCollection (0) | 2021.09.27 |
---|---|
[MRTK 기능 공부] Pulse Shader (0) | 2021.09.27 |
[MRTK 기능 공부] Hand Coach (0) | 2021.09.27 |
[MRTK 기능 공부] Eye-Tracking (0) | 2021.09.27 |
[MRTK 기능 공부] Diagnostics (0) | 2021.09.27 |