주요 콘텐츠로 건너뛰기
버전: 최신

기본 포스 피드백 튜토리얼

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

소개

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

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

장면 설정

빠른 시작 가이드에 표시된 대로 햅틱 스레드와 구형 커서 시각화 도구를 만들어 시작하세요. 가이드와 같이 만듭니다. 그런 다음 평면을 만들고 이름을 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;
}
}