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

基本的なフォース・フィードバック・チュートリアル

物理オブジェクトは、剛性と減衰という2つの特性を持っています。このチュートリアル 水平面との接触による剛性と減衰の両方を取り入れた触覚シミュレーションを紹介します。 このチュートリアルでは、水平面との接触による剛性と減衰の両方を取り入れた触覚シミュレーションを紹介します。シミュレーションが完了すると、「床」を感じ、その剛性と減衰特性を調整することができます。 剛性と減衰特性を調整することができます。

はじめに

このチュートリアルの主な課題は、剛性と減衰の両方を持つ接地面との接触から生じる力を計算する関数を開発することです。 を計算する関数を開発することです。

物体の剛性はバネのような働きをし、圧縮すればするほど大きな力がかかる。これに対して 減衰は物体の動きに対する抵抗である。例えば、水には硬さはありませんが、減衰があります。 減衰があるため、ゆっくり触ると抵抗がなく、速く動くと抵抗が大きくなる。 素早く動くときには大きな抵抗となる。

シーン設定

クイック・スタート・ガイドに示されているように、HapticThreadと球状のカーソル・ビジュアライザーを作成することから始めます。 ガイドを参照してください。次に、Planeを作成し、Groundと名付け、y位置を-0.4に設定します。新しいC#スクリプト GroundForce.csという新しいC#スクリプトを作成し、HapticThreadと同じGameObjectに追加します。 プロパティを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のパッケージマネージャのBasic Force Feedback and Workspace Controlサンプルからインポートできます。

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;
}
}