Skip to content

V1.1(2025.8/8)

8/11更新

レイを矢印に当てると矢印の大きさが変わる機能を追加。


動画↓

なぜか右端に現実世界が録画されていますが録画の問題でアプリの体験とは関係ない不具合です。

なぜか右端に現実世界が録画されていますが録画の問題でアプリの体験とは関係ない不具合です。


目的

  • Meta Quest 3 実機で、コントローラーのレイ照準+トリガー入力により

    Direction(矢印)や HotSpotクリック相当として扱い、設定済みパノラマに切り替える。

  • HMDの向き(Yaw)に合わせて矢印リングが水平方向のみ追従し、常に視認しやすい位置に表示する。

    ※ 垂直方向には追従しない。


操作方法(Meta Quest 3)

  1. コントローラーのレイを矢印に合わせる。
  2. Index Triggerを押す → 対応するパノラマに切り替わる。
  3. 頭の向きを変えると、矢印リングが水平方向に追従し正面付近に表示される。

シーンセットアップ

(Building Blocks/OVRCameraRig 前提)

1. コントローラー設定

  • OVRCameraRig/TrackingSpace/RightControllerAnchorXRPointerToUPano を追加
    • rayOrigin: コントローラー先端の Transform(無ければ子に RayOrigin を作成)

    • hitLayers: Direction(後述の新規Layer)を指定

    • triggerAction: 未設定可(フォールバック動作あり)。

      XRI 使用時は XRI RightHand Interaction/Select Value を割り当て推奨。

2. HMD追従設定

  • 任意オブジェクトに XRHeadToPanTilt を追加
    • panos: 切替対象となる全ての Pano を登録
    • head: OVRCameraRig/TrackingSpace/CenterEyeAnchor
    • syncTilt: OFF(垂直方向追従を無効化)

3. 当たり判定設定

  • DirectionManager(必要に応じて HotSpotManager)の Layer を新規Layer(例: Direction)へ変更

    → 矢印インスタンスはこの Layer を引き継ぐ。

  • 矢印Prefab(defaultPrefabまたは各DirectionのPrefab)にColliderを追加(例: SphereCollider)。

4. 切替先設定

  • Direction の Inspector で

    switchToPanorama または loadPanoramaPrefab を設定。


実装概要

XRPointerToUPano.cs

  • 役割: レイでヒットした Direction / HotSpotInteractiveElement.OnClick を呼び出し、uPanoの切替アクションを実行。
  • 主要フィールド
    • rayOrigin(レイ起点)
    • maxDistance(射程、既定20)
    • hitLayers(対象Layer)
    • triggerAction(Input System アクション、任意)
    • useXRInputDevicesFallback(フォールバック入力有効化、既定ON)
  • 入力判定フロー
    1. triggerAction が設定されていれば triggered または ReadValue<float>() > 0.5
    2. 無ければ XRデバイスの triggerButton(保険で gripButton)を参照
  • ヒット処理
    • Physics.Raycast → ヒット先が DirectionInstance or HotSpotInstanceelement.OnClick.Invoke(element)

XRHeadToPanTilt.cs

  • 役割: HMDのYawを複数 Pano に同期し、矢印リングを水平方向に追従させる。
  • 主要フィールド
    • panos(同期対象)
    • head(HMDカメラ)
    • syncTilt(既定OFF)、clampTilttiltClamp
  • 動作
    • Start: 各 Pano.rotationMode = rotateGameObject
    • Update: yaw を各 Pano.pan に反映(syncTilt ON時は Pitch も同期)

注意点・制約

  • Collider未設定 / Layer不一致 / hitLayersの絞りすぎ → レイが当たらない。
  • switchToPanorama 未設定 → 切替なし。
  • レイの forward がポインター方向と一致している必要。

トラブルシュート

  • 反応しない
    • 矢印PrefabにColliderがあるか
    • DirectionManager の Layer が UPanoInteractable
    • XRPointerToUPano.hitLayersUPanoInteractable を含むか(テスト時は Everything
    • rayOrigin の forward が正しいか
    • DirectionswitchToPanorama が設定されているか
  • クリックは通るが矢印が正面に来ない
    • XRHeadToPanTilt.headCenterEyeAnchor になっているか
    • panos の割当が正しいか
    • syncTilt が OFF か(垂直追従無効化)

導入チェックリスト

  • RightControllerAnchorXRPointerToUPano 追加 → rayOrigin 設定 → hitLayers = UPanoInteractable
  • 矢印Prefabに Collider 追加、DirectionManager の Layer を UPanoInteractable
  • XRHeadToPanTiltpanos[]head を割当(syncTilt は OFF)
  • Direction に切替先を設定(switchToPanorama / loadPanoramaPrefab

Author: 村井 | Source: 村井\uPano×MetaQuest3でパノラマビューアプリデモ開発\V1 1(2025 8 8) 249aba435ee780e6b8b9e508fc99abf1.md