본문으로 건너뛰기

Inverse Unity Package 시작하기

이 가이드에서는 기본적인 설정과 간단한 예제를 통해 ‘Haply Inverse Unity Package’의 기본적인 사용법을 설명합니다. 패키지 설치, 햅틱 리그 설정, 힘 제어 및 위치 제어를 위한 간단한 스크립트 작성에 대해 다룹니다.

자세한 설명이나 고급 기법에 대해서는튜토리얼을참고해 주세요.

버전 지원​

  • Unity 2021.3.x LTS: 지원 대상
  • Unity 2022.1.x LTS: 지원 대상
  • Unity 6000.x LTS: 지원 대상
  • Haply Inverse SDK: 3.1.0 이상

전제 조건​

  • Haply Inverse SDK 버전 3.1.0 이상을 설치해 주십시오.
  • Haply Inverse Service가 정상적으로 작동하는지 확인해 주십시오.
  • 씬을 실행하기 전에,Inverse3 와 VerseGrip 장치가 연결되어 있고 보정이 완료되었는지 확인하십시오.
참고

이 패키지는Inverse3 에 대한 지원을 강화하기 위해 지속적으로 개발되고 있습니다. 지원, 피드백 또는 요청 사항이 있으시면문의해 주시기 바랍니다.

설치​

Inverse Unity 패키지는 Unity의 Scoped Registry에서 다운로드할 수 있습니다. 패키지를 통합하려면 다음 단계를 따르십시오.

  1. ‘편집 > 프로젝트 설정 > 패키지 관리자’를 엽니다. 다음 내용을 입력하여 새로운 Scoped Registry를 추가합니다.

    • 이름: Haply Robotics
    • URL: https://unitypackages.haply.co
    • 범위: co.haply

    범위 지정 레지스트리

  2. 창 > 패키지 관리자 을 열고,추가 + 버튼을 클릭하여,이름으로 패키지 추가 을 선택합니다. co.haply.inverse 라고 입력하고,추가 을 클릭합니다.

    UPM-UI-QUICK-ADD

설치가 완료되면 패키지 관리자에 Inverse 패키지가 표시됩니다.

햅틱 리그 설정​

햅틱 리그를 생성하려면GameObject > Haply Inverse > Haptic Rig (one hand) 로 이동합니다. 이 작업을 통해Inverse3 컨트롤러와 VerseGrip이 포함된 완전한 환경이 구성됩니다.

이 장면에는 다음 내용이 포함됩니다.

  • Haptic Device Mapper: Haply Inverse Service를 사용하여 장치 할당을 관리합니다.
  • 햅틱 오리진: 씬 내에서 햅틱 설정의 크기 조정 및 배치를 수행합니다.
  • 햅틱 컨트롤러: Inverse3VerseGrip의 장치 데이터를 기반으로 커서의 힘 또는 위치를 제어합니다.
  • 커서: 씬을 표시하기 위해Inverse3 커서와 VerseGrip 커서 컴포넌트를 포함합니다.

햅틱 리그

패키지 구성 요소에 대한 자세한 내용은‘Global Architecture’ 문서 페이지를참조하십시오.

플레이 모드에서는 구체가 Inverse3 커서와 VerseGrip의 방향에 맞춰 이동 및 회전합니다.

inverse3-검사자

핸들 인스펙터

토크 제어 모드​

ForceControl.cs C# 스크립트를 작성하고,햅틱 오리진 GameObject에 부착합니다. 이 스크립트를 사용하면 인스펙터의 슬라이더를 통해 Inverse3 장치에 힘을 가할 수 있습니다.

using Haply.Inverse;
using UnityEngine;

public class ForceControl : MonoBehaviour
{
[Range(-2, 2)]
public float forceX;
[Range(-2, 2)]
public float forceY;
[Range(-2, 2)]
public float forceZ;

private Inverse3 _inverse3;

private void Awake()
{
_inverse3 = GetComponentInChildren<Inverse3>();
}

protected void OnEnable()
{
_inverse3.DeviceStateChanged += OnDeviceStateChanged;
}

protected void OnDisable()
{
_inverse3.DeviceStateChanged -= OnDeviceStateChanged;
_inverse3.Release();
}

private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;
inverse3.SetCursorLocalForce(new Vector3(forceX, forceY, forceZ));
}
}

힘 제어

스크립트 설명​

  • forceX, Y, Z: 슬라이더로 조절할 수 있는 힘 벡터의 성분입니다. 힘은,CursorSetForce 메서드에 전달되기 전에 안전한 범위 내에 포함되도록 제한됩니다. 또는 표준 Vector3 필드를 사용할 수도 있습니다.

  • Awake(): 현재 GameObject 또는 그 자식 객체에서 Inverse3 컴포넌트를 가져옵니다.

  • OnEnable(): Awake 메서드 호출 후, 그리고 스크립트가 활성화될 때마다, 햅틱 업데이트를 통해 OnDeviceStateChanged 콜백을 별도의 스레드에서 등록합니다.

  • OnDisable(): 스크립트가 비활성화되거나 애플리케이션이 중지되면 콜백 등록을 해제하고 전원을 재설정합니다.

  • OnDeviceStateChanged: 인스펙터 창에서 force 벡터를 가져온 다음,CursorSetForce 메서드를 사용하여 Inverse3 로 전달합니다.

    중요: 이 콜백은 1kHz에서 8kHz 사이의 높은 주파수로 햅틱 스레드에서 호출됩니다. 이 콜백 내의 모든 코드를 충분히 최적화하는 것이 매우 중요합니다.

사용 방법​

플레이 모드로 들어가기 전에 커서를 누르고 있는지 확인하십시오. 기기는 녹색 표시등으로 표시되는 ‘Force Control’ 상태로 전환됩니다. 그 후, 슬라이더를 사용하여 힘의 출력을 조절하고 기기 작업 공간 내에서 조작할 수 있습니다.

경고

힘을 조절하면 ‘ Inverse3 ’가 움직입니다. 작업 공간에 장애물이 없는지 확인하고, 반드시 커서를 계속 누르고 계십시오. 안전 관련 지침에 대해서는‘안전한 사용’ 관련 문서를참조하십시오.

커서 설정 힘

위치 제어 모드​

마찬가지로, 기기의 위치를 제어하기 위한 PositionControl.cs C# 스크립트를 작성하고,햅틱 오리진 GameObject에 부착합니다.

using Haply.Inverse;
using UnityEngine;

public class PositionControl : MonoBehaviour
{
[Range(-0.1f, 0.1f)]
public float positionX;
[Range(-0.1f, 0.1f)]
public float positionY;
[Range(-0.1f, 0.1f)]
public float positionZ;

private Inverse3 _inverse3;

private void Awake()
{
_inverse3 = GetComponentInChildren<Inverse3>();
}

protected void OnEnable()
{
_inverse3.DeviceStateChanged += OnDeviceStateChanged;
}

protected void OnDisable()
{
_inverse3.DeviceStateChanged -= OnDeviceStateChanged;
_inverse3.Release();
}

private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;
inverse3.SetCursorLocalPosition(inverse3.WorkspaceCenterLocalPosition + new Vector3(positionX, positionY, positionZ));
}
}

ForceControl 스크립트나 장치를 제어하는 기타 스크립트가 비활성화되어 있는지 확인하십시오.

위치 제어

앞서 예시와 마찬가지로:

  • 재생 모드에서 슬라이더를 사용하여 위치 을 조정하려면,positionX, Y, and Z 을(를) 사용합니다.

    선택한 Range(-0.1, 0.1) 는 대략 도달 가능한 최대 위치에 해당합니다.

  • Awake 메서드는 Inverse3 컴포넌트를 가져옵니다.
  • OnEnable 메서드는,Awake 메서드 호출 후, 그리고 스크립트가 활성화될 때마다, 햅틱 업데이트를 통해 OnDeviceStateChanged 콜백을 별도의 스레드에서 등록합니다.
  • OnDisable 이 메서드는 스크립트가 비활성화되거나 애플리케이션이 중지될 때 콜백 등록을 해제하고 전원을 재설정합니다.

다만, 다음과 같은 차이점이 있습니다:

  • OnDeviceStateChanged 콜백은 각 촉각 프레임마다, 인스펙터 창에서 위치 벡터를 가져와 이를 WorkspaceCenterLocalPosition 이에 더해, CursorSetLocalPosition 메서드를 사용하여 Inverse3 로 전송합니다.

재생 모드로 들어가기 전에 커서를 중심 위치 근처에 두십시오. 장치가 위치 제어 상태(파란색 표시등으로 표시됨)로 전환되어야 합니다. 그 후, 슬라이더를 사용하여 위치 출력을 조정하면 장치의 작업 공간을 확인할 수 있습니다.

경고

위치를 조정하면 ‘ Inverse3 ’가 움직입니다. 작업 공간에 귀중품이 없는지 확인하고, 반드시 커서를 계속 누르고 계십시오. 자세한 내용은‘안전한 사용법’ 관련 글을 참조하십시오.

커서 위치 설정