주요 콘텐츠로 건너뛰기
버전: 다음

기본 포스 피드백 튜토리얼

물리적 오브젝트에는 강성과 댐핑이라는 두 가지 속성이 있어 그 느낌을 정의합니다. 이 튜토리얼 에서는 수평면과의 접촉으로 인한 강성과 댐핑을 모두 통합한 햅틱 시뮬레이션을 소개합니다. 수평면과의 접촉으로 인한 강성과 감쇠를 통합한 햅틱 시뮬레이션을 소개합니다. 시뮬레이션이 완료되면 '바닥'을 느낄 수 있고 강성과 댐핑 특성을 조정할 수 있습니다.

소개​

이 튜토리얼의 주요 과제는 강성과 감쇠를 모두 나타내는 접지면과의 접촉으로 인한 강성과 감쇠를 모두 나타내는 접지면과의 접촉에서 발생하는 힘을 계산하는 함수를 개발하는 것입니다.

물체의 강성은 스프링처럼 작용하여 더 많이 압축할수록 더 높은 힘을 가합니다. 반대로 댐핑은 물체의 움직임에 대한 저항입니다. 예를 들어 물은 강성은 없지만 댐핑이 있습니다. 댐핑이 있어 천천히 만질 때는 저항이 없고 빠르게 움직일 때는 많은 저항을 빠르게.

장면 설정​

시작하기 가이드에 표시된 대로 햅틱 스레드와 구형 커서 시각화 도구를 만들어 시작하세요. 가이드에 나와 있습니다. 그런 다음 평면을 만들고 이름을 Ground로 지정한 다음 y 위치를 -0.4로 설정합니다. 새 C# 스크립트 GroundForce.cs라는 새 C# 스크립트를 생성하고, HapticThread와 동일한 게임 오브젝트에 추가한 다음 다음 프로퍼티를 GroundForce 클래스에 추가합니다.

[Range(0, 800)]
public float stiffness = 600f;
[Range(0, 3)]
public float damping = 1;

public Transform ground;
private float m_groundHeight;
private float m_cursorRadius;

비행기에서 멀어질 때 Inverse3 어떤 힘도 발생해서는 안 됩니다. 힘은 다음과 같은 경우에만 나타납니다. 커서가 평면 표면에 닿을 때, 즉 커서가 평면을 관통할 때만 나타납니다. 침투 깊이 계산은 평면 위치뿐만 아니라 커서 시각화 반경에 따라 달라집니다. 의 경우 이 경우 Inverse3 위치에서 커서 반경을 빼면 커서의 상대적 위치가 올바르게 렌더링됩니다. 커서의 상대적 위치를 올바르게 렌더링하는 데 충분합니다.

커서가 평면에 닿을 때 발생하는 힘은 커서의 위치와 속도에 따라 달라집니다, 에 따라 달라지는데, 이는 모두 Inverse3 ( Inverse3 로 개발하기 참조 ) 에서 제공합니다. ForceCalculation 메서드는

private Vector3 ForceCalculation ( in Vector3 position, in Vector3 velocity )
{
var force = Vector3.zero;

// Bottom of the sphere
var contactPoint = position.y - m_cursorRadius;

var penetration = m_groundHeight - contactPoint;
if ( penetration > 0 )
{
force.y = penetration * stiffness - velocity.y * damping;
}

return force;
}

그런 다음 Awake 메서드: 할당 m_groundHeight 그리고 m_cursorRadius에서 햅틱 스레드, 를 클릭하고 시작하세요.

private void Awake ()
{
m_groundHeight = ground.transform.position.y;

var hapticThread = GetComponent<HapticThread>();
m_cursorRadius = hapticThread.avatar.lossyScale.y / 2;

hapticThread.onInitialized.AddListener(() => hapticThread.Run( ForceCalculation ));
}

마지막으로 GroundForce 스크립트에 대한 인스펙터 창을 열고 Ground 평면을 해당 필드에 해당 필드에 할당합니다. 게임 모드를 시작하고 그라운드 평면을 터치합니다. 다양한 강성 및 댐핑 값으로 실험하고 두 가지가 만들어내는 감각의 차이를 확인합니다.

커서가 바닥에 닿았습니다.

소스 파일​

이 예제에서 사용된 최종 씬과 모든 관련 파일은 Unity의 패키지 관리자에서 기본 포스 피드백 및 워크스페이스 컨트롤 샘플을 임포트할 수 있습니다.

using Haply.HardwareAPI.Unity;
using UnityEngine;

public class GroundForce : MonoBehaviour
{
[Range(0, 800)]
public float stiffness = 600f;
[Range(0, 3)]
public float damping = 1;

public Transform ground;

private float m_groundHeight;
private float m_cursorRadius;

private void Start ()
{
var hapticThread = GetComponent<HapticThread>();

m_groundHeight = ground.transform.position.y;
m_cursorRadius = hapticThread.avatar.lossyScale.y / 2;

hapticThread.onInitialized.AddListener(() => hapticThread.Run( ForceCalculation ));
}

private Vector3 ForceCalculation ( in Vector3 position, in Vector3 velocity )
{
var force = Vector3.zero;

var contactPoint = position.y - m_cursorRadius;
var penetration = m_groundHeight - contactPoint;
if ( penetration > 0 )
{
force.y = penetration * stiffness;
force.y -= velocity.y * damping;
}

return force;
}
}