MRが楽しい

MRやVRについて学習したことを書き残す

MRTK v2を用いて両手でオブジェクトをドラッグ操作する

本日は MRTKv2 の技術調査枠です。
MRTKv2 を用いて両手でオブジェクトをドラッグ操作する方法を記事にします。
f:id:bluebirdofoz:20191109222012j:plain

プロジェクトとシーンの準備

最初に、以下の記事を参考にプロジェクトのシーンを構築します。
bluebirdofoz.hatenablog.com

「サンプルシーンの作成」まで実施し、以下の Cube オブジェクトが配置されたシーンを準備します。
f:id:bluebirdofoz:20191109222028j:plain

ManipulationHandlerの追加

ドラッグ操作を行いたいオブジェクトを選択し、Inspector ビューを開きます。
オブジェクトに Collider が設定されていることを確認します。
f:id:bluebirdofoz:20191109222038j:plain

オブジェクトの[Add Component]を開き、[ManipulationHandler]コンポーネントを検索して選択します。
f:id:bluebirdofoz:20191109222046j:plain

以下の通り、[ManipulationHandler]コンポーネントが追加されました。
f:id:bluebirdofoz:20191109222055j:plain

[再生]ボタンをクリックして、動作を確認してみます。
シーン内でオブジェクトにカーソルを合わせ、タップとドラッグ操作を行うとオブジェクトが操作できます。
f:id:bluebirdofoz:20191109222105j:plain

ManipulationHandlerのプロパティ

ManipulationHandlerのプロパティでそれぞれ以下の設定が変更できます。

Host Transform

ドラッグ操作でトランスフォームが変化するオブジェクトを指定できます。
デフォルトでは[None(Transform]で、この場合、[ManipulationHandler]をアタッチしたオブジェクト自体が動きます。

Manipulation Type

オブジェクトを片手、両手、または両方で操作できるかどうかを指定します。

One Handed Only片手のみ
Two Handed Only両手のみ
One And Two Handed片手と両手

Two Handed Manipulation Type

両手操作で変化させるトランスフォームの項目を指定します。

Scaleスケーリングのみ許可
Rotate回転のみ許可
Move Scale移動とスケーリングを許可
Move Rotate移動と回転を許可
Rotate Scale回転とスケーリングを許可
Move Rotate Scale移動、回転、スケーリング全てを許可

Allow Far Manipulation

ポインターでの遠隔操作を使用して操作を実行できるかどうかを指定します。

One Hand Rotation Mode Near と One Hand Rotation Mode Far

片手で近くまたは遠くのオブジェクトをつかんだときのオブジェクトの回転動作を指定します。
デフォルトでは[Rotate About Grab Point]で、この場合、移動時にオブジェクトが手の方向を向き続けるように回転します。
回転させたくない場合は[Maintain Original Rotation]を選択します。

Maintain original rotationオブジェクトは移動中に回転しません
Maintain rotation to userユーザーに対するX/Y軸のオブジェクトの元の回転を維持します
Gravity aligned maintain rotation to userオブジェクトの元の回転をユーザーに対して維持しますが、オブジェクトを垂直にします。バウンディングボックスに適しています
Face userオブジェクトが常にユーザーに向くようにします。平面パネルに適しています
Face away from userオブジェクトが常にユーザーの反対側を向くようにします。前後逆に構成された平面パネルに適しています
Rotate about object center関節式の手/コントローラーでのみ機能します。手/コントローラーの回転を使用して、オブジェクトの中心点を中心にオブジェクトを回転します
Rotate about grab point関節式の手/コントローラーでのみ機能します。手/コントローラで保持されているかのようにオブジェクトを回転させます

Release Behavior

オブジェクトがリリースされたときの物理的な動きの動作を指定します。
オブジェクト上に[rigidbody]コンポーネントが必要です。

Nothingなし
Keep Velocity速度を維持する
Keep Angular Velocity各速度を維持する
Everything全て維持する

Constraints on Rotation

相互作用時にオブジェクトが回転する軸を指定します。

None指定なし
X-Axis OnlyX軸
Y-Axis OnlyY軸
Z-Axis OnlyZ軸

Constraints on Movement

相互作用時にオブジェクトが移動する距離を指定します。


None指定なし
Fix distance from head頭からの距離を維持する

Smoothing Active

動き、スケール、回転操作のスムージング処理が有効化かを指定します

Smoothing Amount One Hand

動き、スケール、回転に適用するスムージングの量を指定します。
スムージングが0の場合、スムージングは行われません。最大値は値が変更しないことを意味します。

Manipulation Events

操作ハンドラーは、次のイベントを提供します。

OnManipulationStarted操作が開始されると発生します
OnManipulationEnded操作が終了すると起動します
OnHoverStarted手/コントローラーが操作可能に近づいたり遠ざかったりすると起動します
OnHoverEnded手/コントローラーが操作可能、近くまたは遠くに離れたときに発生します

スケールの最小値または最大値を設定する

オブジェクトのスケールの最小値または最大値を設定する場合は[TransformScaleHandler]コンポーネントを追加します。
プロパティの設定値はスケールの絶対値ではなく倍率になります。
f:id:bluebirdofoz:20191109222131j:plain

Target Transform

スケールの制限をかけるオブジェクトを指定できます。
デフォルトでは[None(Transform]で、この場合、[TransformScaleHandler]をアタッチしたオブジェクト自体が動きます。

Scale Minimum

スケールの最小値を定義します。

Scale Maximum

スケールの最大値を定義します。

Relative To Initial State

チェック時、設定値をオブジェクトの初期スケールに対して相対的な値として扱います。
チェックしない場合、設定値はスケールの絶対値として扱われます。

参考ページ

github.com