EasyCastleUNITY

OVR Haptic Feedback 탐구 본문

Oculus VR 탐구

OVR Haptic Feedback 탐구

EasyCastleT 2023. 11. 14. 16:05

https://developer.oculus.com/documentation/unity/unity-haptics/

 

Haptic Feedback | Oculus Developers

 

developer.oculus.com

이 글은 위 링크의 문서를 바탕으로 만들고 작성했으며, Oculus Integration SDK 57.0버전을 기준으로 작성되었습니다. 참고하여 주시기 바랍니다.

Meta Haptics Studio and Haptics SDK

 

Meta Haptics Studio와 Haptics SDK는 동급 최고의 Haptic 경험을 신속하게 디자인하고, 테스트 및 앱에 통합 할 수 있는 도구입니다. 

 

이러한 도구들은 Quest 장치의 Haptic 생성 및 통합을 위해 권장되는 방법입니다. 

런타임 API를 통해 간단하고 높은 수준의 추상화(high-level abstractions) 및 워크플로우(workflow)를 제공합니다.

하위 수준의 제어 흐름 코드 작성에 대해 걱정하거나 런타임 장치 확인 및 호환성에 대해 생각할 필요 없이 Haptic을 보다 쉽게 설계하고 구현할 수 있습니다. 


Process(절차)

1. 단일 또는 여러 오디오 파일을 로드하여 Haptic을 디자인하세요. 오디오-햅틱 분석은 오디오 파일에서 Haptic을 생성하기 위해 자동으로 수행됩니다. 

2. 헤드셋에서 클립을 오디션해 보세요. 분선 매개변수를 변경하거나 Haptic 클립을 수동으로 편집하여 필요한 편집을 수행합니다. 변경 사항은 VR Companion 앱에 실시간으로 전파됩니다. 

3. 작업이 끝난 클립들을 프로젝트 폴더로 내보내세요.

4.Haptic SDK를 사용하여 .haptic 파일울 애플리케이션에 통합합니다. 

Downloads and Documentation(다운로드와 문서)

Mac 및 Windows용 데스크톱 애플리케이션(VR앱 포함)인 Haptics Studio를 사용하면 디자이너와 개발자가 코드를 작성하거나 컴파일할 필요없이 Meta Quest 용 Haptic을 만들고 오디션 할 수 있습니다. 

 

Unity용 Haptics SDK는 Quest 컨트롤러의 Haptics Studio에서 제작된 햅틱 클립을 재생하기 위한 높은 수준의 미디어 기반 API를 제공합니다. Haptics SDK는 연결된 Quest 컨트롤러 유형에 관계없이 통합된 Haptic API를 제공합니다. 

SDK는 런타임 시 컨트롤러를 감지하고 Haptic 패턴을 최적화하여 컨트롤러의 기능을 극대화합니다. 이 기능을 사용하면 Haptic 클립이 Quest 장치와 역호환 및 호환이 가능합니다. 


Other Runtime APIs (다른 런타임 API)

Haptics Studio 및 Haptics SDK는 Quest의 Haptic에 권장되는 경로이지만 런타임에서 사용할 수 있는 다른 Haptic API도 많이 있습니다. 이는 애플리케이션에 대한 하위 수준 제어를 제공하며 일부 특정 상황에서 유용할 수 있습니다. 

맟춤형 미들웨어 통합을 구축할 때나, Touch Pro 로컬라이징된 Haptic을 추가하는 등 컨트롤러별 API를 사용할 때 이러한 API를 고려할 수 있습니다. 


OVRInput Haptics

OVRInput의 SetControllerVibration()을 사용하여 컨트롤러의 Haptic을 시작하고 중지합니다. 

진동을 시작, 업데이트 또는 종료하려면 변경하려는 프레임에서 SetControllerVibration()을 호출하세요.

static void OVRInput.SetControllerVibration(float frequency, float amplitude, Controller controllerMask)

진폭의 예상 값은 0과 1사이의 값입니다. 진폭(amplitude)이 클수록 컨트롤러의 진동이 강해집니다. Haptic을 활성화하려면 빈도를 1로 설정해야 합니다.  진동을 종료하려면 진폭과 주파수(frequency)를 모두 0으로 설정합니다. 컨트롤러 진동은 마지막 입력 후 2초 후에 자동으로 종료됩니다. 

 

주파수에 대한 참고사항: Haptic을 활성화하려면 주파수를 1로 설정해야 합니다. 하지만 이 값은 컨트롤러가 진동하는 실제 주파수에 더 이상 영향을 미치지 않습니다.  모터의 주파수를 동적으로 변경하는 유일한 방법은 Haptics SDK 또는 PCM Haptic을 Haptic API로 사용하는 것 입니다. 

 

컨트롤러에 지원되는 값은 Developer Reference에 나와있습니다.  

// starts vibration on the right Touch controller
OVRInput.SetControllerVibration(1, 1, OVRInput.Controller.RTouch)

Enum Descriptions

public enum InteractionProfile
{
	None                      = OVRPlugin.InteractionProfile.None,
	Touch                     = OVRPlugin.InteractionProfile.Touch,
	TouchPro                  = OVRPlugin.InteractionProfile.TouchPro,
}

다양한 상호 작용 프로필을 다음과 같습니다 : 

  • OVRPlugin.InteractionProfile.Touch: Oculus Quest Touch Controller
  • OVRPlugin.InteractionProfile.TouchPro: Meta Quest Touch Pro Controller

New Haptics Locations

public enum HapticsLocation
{
	None                      = OVRPlugin.HapticsLocation.None,
	Hand                      = OVRPlugin.HapticsLocation.Hand,
	Thumb                     = OVRPlugin.HapticsLocation.Thumb,
	Index                     = OVRPlugin.HapticsLocation.Index,
}

Meta Quest Touch Pro 컨트롤러에는 Haptic을 재생할 수 있는 3가지 요소가 있습니다. 엄지와 트리거 용 LRA(Linear Resonant Actuator) 2개와  VCM(Voice Coil Motor) 1개 입니다. 

 

LRA는 설정된 주파수에서 진동합니다. 즉, 조정 할 수 있는 유일한 것을 진폭 뿐입니다.

반면에 VCM은 훨씬 더 넓은 범위의 주파수 (50Hz~500Hz)에서 진동할 수 있습니다. 

이를 통해 낮은 천둥소리와 높은 음조의 경보음을 구별할 수 있으므로 더욱 몰입감 있는 경험이 가능합니다. 

 

Haptic들을 트리거하는 동안 효과가 재생되어야 하는 위치를 지정할 수 있습니다. 

이 위치는 HapticsLocation 열거형을 사용하여 지정됩니다. 

  • OVRPlugin.HapticsLocation.Hand: VCM에서의 메인 Haptic들의 위치
  • OVRPlugin.HapticsLocation.Thumb: LRA에서의 엄지 위의 Haptic들의 위치
  • OVRPlugin.HapticsLocation.Index: LRA에서의 트리거 위의 Haptic들의 위치

HapticsAmplitudeEnvelopeVibration

아래 사진과 같은 복잡한 아날로그 신호를 고려하세요

신호의 진폭 Envelope는 신호의 극단을 나타내는 부드러운 곡선입니다. 

위 신호의 진폭 Envelope는 다음과 같습니다. 

public struct HapticsAmplitudeEnvelopeVibration
{
	public int SamplesCount;
	public float[] Samples;
	public float Duration;
}

 

이러한 구조체는 진폭 Envelope Haptic 효과를 지정하는 데 사용됩니다. 

필드들은 다음과 같이 설명됩니다:

Field Description (설명)
Samples 진폭 envelope 값을 나타내는 부동 소수점 배열
SamplesCount 'Samples' 배열의 요소 수 
Duration Haptic 효과의 지속 시간을 초 단위로 나타내는 부동 소수점 값 

HapticsPcmVibration

public struct HapticsPcmVibration
{
	public int SamplesCount;
	public float[] Samples;
	public float SampleRateHz;
	public bool Append;
}

PCM(Pulse Code Modulation)효과는 충실도가 높은 Haptic 효과를 생성합니다. 그러나 AmpltideEnvelope와 달리 이 효과는 작성자에게 더 복잡합니다. 

필드들은 다음과 같이 설명됩니다:

Field Description (설명)
Samples 부동 소수점 배열. Haptic 피드백 샘플을 나타냅니다. Haptic 효과를 샘플링된 아날로그 오디오로 간주하면 이 버퍼(buffer)에는 해당 효과를 나타내는 샘플이 포합됩니다. 
SamplesCount 'Samples' 배열의 샘플 갯수 입니다. 
SampleRateHz 초당 'Samples'에서 재생될 샘플 수를 나타내는 부동 소수점 값입니다. 이는 효과의 지속 시간을 결정하는데 사용됩니다. 
Append 긴 Haptic 효과를 지원하려면 이 플래그를 true로 설정하세요. 즉, 현재 재생 중인 효과가 완료된 후에 효과가 재생됩니다. 만약 Append가 거짓이면 제공된 효과가 즉시 재생되기 시작합니다. 

SetControllerLocalizedVibration

public static void SetControllerLocalizedVibration(
            HapticsLocation hapticsLocationMask,
            float frequency,
            float amplitude,
            Controller controllerMask = Controller.Active)

이 기능은 엄지 손가락과 트리거 위치에서 Haptic을 트리거하는 데 사용됩니다. 

매개 변수는 다음과 같이 설명됩니다:

  • hapticsLocationMask: 효과가 재생될 위치를 나타냅니다. 자세한 내용은 'HapticsLocation' 열거형을 참고하세요
  • frequency : 효과의 빈도를 나타내는 부동 소수점 값
  • amplitude: 효과의 진폭을 나타내는 부동 소수점 값

모든 로컬라이징된 Haptic 효과의 기본 지속 시간은 2초입니다. 

SetControllerHapticsAmplitudeEnvelope

public static void SetControllerHapticsAmplitudeEnvelope(
                HapticsAmplitudeEnvelopeVibration hapticsVibration,
                Controller controllerMask = Controller.Active)

이 함수는 진폭 Envelope Haptic 효과를 트리거하는 데 사용됩니다. ‘HapticsAmplitudeEnvelopeVibration’ 을 매개변수로 사용합니다. 이 구조체에는 효과에 대한 설명이 포함됩니다. 

 

이 메서드가 호출될 때 효과가 이미 재생 중이면 새로운 효과가 즉시 재생되기 시작합니다. 

SetControllerHapticsPcm

public static int SetControllerHapticsPcm(
                HapticsPcmVibration hapticsVibration,
                Controller controllerMask = Controller.Active)

이 함수는 PCM Haptic 효과를 트리거하는 데 사용됩니다. ‘HapticsPcmVibration’ 을 매개변수로 사용합니다. 이 구조체는 PCM 효과를 설명합니다. 

 

이 효과가 Meta Quest Touch 컨트롤러에서 트리거 되면 리샘플링이 수행되고 동등한 Haptic 효과가 컨트롤러에서 재생됩니다. 리샘플링을 원하지 않는 경우, GetControllerSampleHz 함수에서 반환된 SampleRate를 사용하고 이 SampleRate를 기반으로 Haptic 데이터를 생성하는 것이 좋습니다. 

 

반환값은 소비된 샘플 수 입니다. 

GetControllerSampleRateHz

public static float GetControllerSampleRateHz(Controller controllerMask = Controller.Active)

GetCurrentInteractionProfile

public static OVRInput.InteractionProfile GetCurrentInteractionProfile(OVRInput.Hand hand)

연결된 장치 유형에 따라 상호 작용 프로필 유형을 반환합니다.