本文へスキップ
バージョン:最新

デバイス・ワークスペース変換チュートリアル

ハプティックシミュレーションは、大小さまざまな物理オブジェクトのジオメトリを再現しようとするものです。 Unityは内部計算に浮動小数点を使用しています。 より効率的で正確であることを意味します。 シーンをInverse3のワークスペースにスケールダウンするよりも効率的です。このチュートリアルは、基本的な このチュートリアルは、Generate BasicForce-feedbackチュートリアルをベースに、Inverse3 のワークスペースにモーションをスケーリングして配置する方法を説明します。 このチュートリアルでは、基本的なフォースフィードバックの生成チュートリアルをベースに、Inverse3 のワークスペースの位置とモーションのスケールを説明します。

はじめに

カーソルの動きをスケールするには、Haptic WorkspaceGameObjectを作成し、その子としてカーソル を配置します。Haptic Workspaceの移動は、シーンに対するInverse3の位置のコントロールにもなります。 つまり、シーンを動かすことなく、カーソルの動きを別の場所に移動させることができます。 つまり、シーンを動かすことなく、カーソルのモーションを別の場所に移動できます。

開始する前に 基本的なフォースフィードバックの生成 チュートリアルを読み、プロジェクトを開きます。次に、空のGameObjectを作成し、名前を ハプティック・ワークスペースそして に設定する。 (10, 10, 10).この例では、スケールを10に設定すると、1mのオブジェクトが10cmにしか感じられなくなります。 が10cmしかないように感じますが、任意の正の数に設定することができます。

また、Haptic Workspaceでは、デバイスのワークスペースをシーンに対して相対的に配置することができます。 この例では、ワークスペースを上下に動かすことができます。この例では、ワークスペースを上下に動かすことができます。

階層ウィンドウで、CursorオブジェクトをHaptic Workspaceの上にドラッグして、Haptic Workspaceの子にします。 Haptic Workspaceの子にします。

また HapticThread そして GroundForce スクリプトは ハプティック・スレッド GameObjectを その ハプティック・ワークスペース そして ハプティック・スレッド 現在では空で役に立たないが、削除することができる。

ワークスペース階層

では、開いてみよう。 GroundForce.cs そして以下のメンバーを追加する:

private float m_workspaceScale;
private float m_workspaceHeight;

m_workspaceScale のスケーリング係数を保持する。 ハプティック・ワークスペース 前のステップで設定した と同時に m_workspaceHeight はY軸上のワークスペースのシーン内位置オフセットを表す。次に の2つの変数を初期化する。 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 は決してスケールアップもスケールダウンもしない。

プレイ・モードに入ると、カーソルの動きはより顕著になりますが、インスペクタ・ウィンドウのカーソルの読みは変わりません。 インスペクタ・ウィンドウのカーソルの読みは変わりません。また、Haptic Workspaceのpositionパラメータを使ってワークスペースを動かすこともできます。 位置パラメータを使ってワークスペースを移動することもできます。

ハプティック計算は、あたかも平面が無限であるかのように、平面を横切る力を生成することに注意してください。 ワークスペースを横に動かしても、ビジュアライゼーションに影響するだけです。

ワークスペース・スケール

ワークスペース・オフセット・トランスレーション

ソースファイル

このサンプルで使用する最終的なシーンとすべての関連ファイルは、Basic Force Feedback and Workspace Controlサンプルからインポートできます。

グラウンドフォース.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;
}
}