Open6
【未解決】Valve IndexのGrabの閾値を調整したい
環境
- Unity 2022.3.7f1
- XR Interaction Toolkit 2.2.0
- OpenXR 1.4.2
- Valve Indexの動作環境
やりたいこと
- Valve Indexでオブジェクトをつかむときの、手の握る強さをVRChatと同じくらいにしたい
関連記事
現状の設計
- XRIのデフォルトのInputActionsの設定から、Selectだけ少し変化させている
- Valve IndexでGripPressedによってselectの判定をした場合(これがデフォルト)、指を触れただけで持った判定になってしまう。これだとすぐものが持ててしまうため変更している
- ActionType: Buttonの下に、OculusはgripPressed、ValveはgripForceをバインドしている(Viveはまだ対応していないがOculusと同じようになる予定?)
Valve Indexでのselect判定
- gripForce(握りしめている強さ。触れているときが0、握っていくにつれて1まで増えるfloat値)が一定の値(閾値)を超えると、pressedと判定される模様。
- この閾値がどのくらいなのか?操作できるのか?というのが今回の問
やったこと
どの閾値で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くらいだった
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で加工していると思われる
Input Systemの設定を独自にする
- 以下の画像のように、Default Button Press Pointの値を
0.5
→0.25
に変更してみる
- しかし、結果は変わらなかった。
Q: この設定は読み込まれているのか?
- 試しに、Supported DevicesにValveIndexのコントローラーだけを指定してみた
- すると、HMDの入力を受け付けなったのか、表示が画面にくっつくようになった
- よって、Input System Package自体の変更は反映されている模様
- OpenXR系のコントローラーの閾値は、このDefaultではなく独自に設定されているのか?
OpenXRのInputActionのソースを読みにいく
- 上記コードの、
input.action.IsPressed
のIsPressed
の定義元へ - 以下のような説明が書いてあった。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;