디바이스 작업 공간 변환 튜토리얼
햅틱 시뮬레이션은 크거나 작을 수 있는 물리적 오브젝트의 지오메트리를 복제하려고 시도합니다. Unity는 내부 계산에 부동 소수점을 사용하므로 큰 씬을 사용하는 것이 더 효율적이고 정확합니다. 미터 단위의 큰 씬을 사용하여 Inverse3의 모션 스케일을 조정하는 것이 더 효율적이고 정확합니다. 씬을 Inverse3의 작업 공간에 맞게 축소하는 것보다 더 효율적이고 정확합니다. 이 튜토리얼은 기본 생성하기 튜토리얼을 기반으로 합니다. 포스 피드백 튜토리얼을 기반으로 모션 스케일과 위치를 조정하는 방법을 보여줍니다. 모션 스케일과 위치를 조정하는 방법을 보여줍니다.
소개
커서 이동의 크기를 조정하려면 햅틱 워크스페이스 게임 오브젝트를 생성하고 커서 구체를 그 자손으로 배치합니다. 햅틱 워크스페이스 변환은 또한 씬에 대한 Inverse3의 위치를 제어할 수 있으므로 씬을 이동하지 않고도 커서 모션을 다른 위치로 다른 위치로 이동할 수 있습니다.
시작하기 전에 기본 포스 피드백 생성
튜토리얼을 참조하여 프로젝트를 엽니다. 그런 다음 빈 게임 오브젝트를 생성하고 이름을 지정합니다. 햅틱 작업 공간로 설정하고
스케일을 (10, 10, 10)
. 이 예제에서 배율을 10으로 설정하면 씬의 1m 오브젝트
을 10cm만 보이게 하지만 양수로 설정할 수 있습니다.
또한 햅틱 워크스페이스를 사용하면 장면을 기준으로 디바이스 워크스페이스를 배치할 수 있습니다. 위치를 변경할 수 있습니다. 이 예제에서는 작업 공간을 위아래로 이동할 수 있습니다.
계층 구조 창에서 커서 개체를 햅틱 작업 영역으로 드래그하여 햅틱 작업 영역의 자식 햅틱 워크스페이스의자식으로 만듭니다.
또한, HapticThread
그리고 GroundForce
스크립트에서 이동할 수 있습니다. 햅틱 스레드 게임 오브젝트에
를 햅틱 작업 공간 그리고 햅틱 스레드 이제 비어 있고 쓸모없는 항목은 삭제할 수 있습니다.
이제 열기 GroundForce.cs
를 클릭하고 다음 멤버를 추가합니다:
private float m_workspaceScale;
private float m_workspaceHeight;
m_workspaceScale
의 스케일링 계수를 보유합니다. 햅틱 작업 공간 이전 단계에서 설정한
동안 m_workspaceHeight
는 Y축에서 작업 공간의 인 씬 위치 오프셋을 나타냅니다. 다음
에서 두 변수를 초기화합니다. Awake
메서드를 추가하여
m_workspaceScale = hapticThread.avatar.parent.lossyScale.y;
m_workspaceHeight = hapticThread.avatar.parent.position.y;
이제 업데이트 ForceCalculation
를 사용하여 위치 오프셋과 스케일 변경을 모두 고려하여
스케일 계산 시 contactPoint
를 대체하여
var contactPoint = position.y - m_cursorRadius;
와 함께,
var contactPoint = (position.y * m_workspaceScale) + m_workspaceHeight - m_cursorRadius;
스케일 모션은 씬에 따라 힘의 스케일을 조정합니다. 이를 방지하려면 힘
계산을 스케일링 계수로 나누어 위치 스케일링을 제거해야 합니다. m_workspaceScale
다음과 같이
force.y = penetration * stiffness;
가 됩니다,
force.y = (penetration / m_workspaceScale) * stiffness;
주목할 점은
velocity
는 절대 확장되거나 축소되지 않습니다.
재생 모드로 들어가면 커서 동작이 더 뚜렷해지지만 인스펙터 창의 인스펙터 창의커서 판독값은 동일하게 유지됩니다. 햅틱 작업 영역의 위치 매개변수를 사용하여 작업 영역을 이동할 수도 있습니다. 위치 매개변수를 사용하여 작업 영역을 이동할 수도 있습니다.
햅틱 계산은 평면 전체에 무한대인 것처럼 힘을 생성하므로 작업 영역을 옆으로 이동하면 시각화에만 영향을 미칩니다.
소스 파일
이 예제에서 사용된 최종 씬과 모든 관련 파일은 Unity 패키지 관리자의 기본 포스 샘플에서 임포트할 수 있습니다. 피드백 및 워크스페이스 컨트롤 샘플에서 임포트할 수 있습니다.
GroundForce.cs
using Haply.HardwareAPI.Unity;
using UnityEngine;
public class GroundForce : MonoBehaviour
{
[Range(0, 800)]
public float stiffness = 600f;
public Transform ground;
private float m_groundHeight;
private float m_cursorRadius;
// Cursor Offset
private float m_workspaceScale;
private float m_workspaceHeight;
private void Awake ()
{
var hapticThread = GetComponent<HapticThread>();
m_groundHeight = ground.transform.position.y;
m_cursorRadius = hapticThread.avatar.lossyScale.y / 2;
m_workspaceScale = hapticThread.avatar.parent.lossyScale.y;
m_workspaceHeight = hapticThread.avatar.parent.position.y;
hapticThread.onInitialized.AddListener(() => hapticThread.Run( ForceCalculation ));
}
private Vector3 ForceCalculation ( in Vector3 position, in Vector3 velocity )
{
var force = Vector3.zero;
// Contact point scaled by parent offset
var contactPoint = (position.y * m_workspaceScale) + m_workspaceHeight - m_cursorRadius;
var penetration = m_groundHeight - contactPoint;
if ( penetration > 0 )
{
force.y = (penetration / m_workspaceScale);;
force.y -= velocity.y * damping;
}
return force;
}
}