Open6

【未解決】Valve IndexのGrabの閾値を調整したい

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

現状の設計

  • XRIのデフォルトのInputActionsの設定から、Selectだけ少し変化させている
  • Valve IndexでGripPressedによってselectの判定をした場合(これがデフォルト)、指を触れただけで持った判定になってしまう。これだとすぐものが持ててしまうため変更している
  • ActionType: Buttonの下に、OculusはgripPressed、ValveはgripForceをバインドしている(Viveはまだ対応していないがOculusと同じようになる予定?)

Valve Indexでのselect判定

  • gripForce(握りしめている強さ。触れているときが0、握っていくにつれて1まで増えるfloat値)が一定の値(閾値)を超えると、pressedと判定される模様。
  • この閾値がどのくらいなのか?操作できるのか?というのが今回の問
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

やったこと

どの閾値でpressedと判定されているのか調べる

  • 以下のようにテスト用のActionを作る
  • このアクションを以下のスクリプトに参照させる
    • pressed判定の時だけ、gripForceの値を知ることができる
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.XR.Interaction.Toolkit;

public class Test : MonoBehaviour
{
    [SerializeField] private InputActionReference input;

    // Update is called once per frame
    void Update()
    {
        bool isPressed = input.action.IsPressed();
        float gripForce = input.action.ReadValue<float>();
        if (isPressed)
        {
            Debug.Log(gripForce);   
        }
    }
}
  • 結果、pressedの判定開始は0.5くらい、判定終了は0.37くらいだった

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

ButtonがPressedになる閾値の設定

  • ProjectSettingsの中でデフォルトを設定しているところがある
  • Input System Packageから以下が分かる
    • 入力開始は0.5
    • 入力解除は0.5 * 0.75(Release Threshold)= 0.375
    • これは先ほどの実験結果と一致する

Processorsについて(やや脱線)

  • Binding Propertyとして、Processorsを設定することができる
  • scaleでgripForceの値を大きく(小さく)することができる。これによって、小さく握った力でもpressed判定されないか?と考えた。
  • 結果はされなかった。gripForceの値はscale分だけ大きくなるが、pressed判定されたときの値もscale分大きくなっている。内部的には、まず純粋な入力値からpressedの閾値を超えるか判定して、その後でgripForceの値をprocessorで加工していると思われる
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

Input Systemの設定を独自にする

  • 以下の画像のように、Default Button Press Pointの値を 0.50.25 に変更してみる
  • しかし、結果は変わらなかった。

Q: この設定は読み込まれているのか?

  • 試しに、Supported DevicesにValveIndexのコントローラーだけを指定してみた
  • すると、HMDの入力を受け付けなったのか、表示が画面にくっつくようになった
  • よって、Input System Package自体の変更は反映されている模様
  • OpenXR系のコントローラーの閾値は、このDefaultではなく独自に設定されているのか?
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

OpenXRのInputActionのソースを読みにいく

  • 上記コードの、input.action.IsPressedIsPressed の定義元へ
  • 以下のような説明が書いてあった。custom buttonのpress pointは、defaultより優先されるとのこと。
/// Finally, note that custom button press points of controls (see <see cref="ButtonControl.pressPoint"/>)
/// are respected and will take precedence over <see cref="InputSettings.defaultButtonPressPoint"/>.
  • それはどこから設定するの?

ButtonControl.pressPointへ飛ぶ

  • -1と設定されているのでデフォルトが使われるのか?? ValveIndexの設定が個別にあればそれを見たい。
        /// <summary>
        /// The minimum value the button has to reach for it to be considered pressed.
        /// </summary>
        /// <value>Button press threshold.</value>
        /// <remarks>
        /// The button is considered pressed, if it has a value equal to or greater than
        /// this value.
        ///
        /// By default, this property is set to -1. If the value of the property is negative,
        /// <see cref="InputSettings.defaultButtonPressPoint"/> is used.
        ///
        /// The value can be configured as a parameter in a layout.
        /// ...省略...
        /// <seealso cref="InputSettings.defaultButtonPressPoint"/>
        /// <seealso cref="pressPointOrDefault"/>
        /// <seealso cref="isPressed"/>
        public float pressPoint = -1;