サブスペース修飾子について

対象となる XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
XR ヘッドセット
有線 XR グラス

SubspaceModifier は、Subspace 内のコンポーザブルの Compose 修飾子に似ています。SubspaceModifier を使用すると、3D 空間でコンポーザブルを操作できます。これにより、3D レイアウト ノードの配置、回転、動作の追加を行うことができます。

レイアウト

デフォルトでは、Subspace はアプリの表示に推奨されるスペースに制限されます。これらの境界は、2D Compose レイアウトの境界と同様に、サブスペース コンポーネントのレイアウトを測定する際に使用されます。

塗りつぶしの境界

修飾子 fillMaxSize、fillMaxWidth、fillMaxHeight、fillMaxDepth は、コンテンツが親の境界を(部分的に)埋めるようにします。fill 修飾子を使用すると、XR デバイスのディスプレイ特性に依存しないコンテンツをアプリでレイアウトできます。

サイズと必須サイズを設定する

修飾子 size、width、height、depth は、コンテンツの推奨サイズを宣言します。コンテンツの正確なサイズを宣言するには、requiredSize、requiredWidth、requiredHeight、requiredDepth を使用します。これらの単位は dp で指定する必要があります。メートルから dp に変換するには、Meter.toDp() を使用します。

コンポーザブルを配置する

offset

offset 修飾子は、x 軸、y 軸、z 軸に沿って 3D 空間でコンポーザブルを移動します。これらの単位は dp で指定する必要があります。メートルから dp に変換するには、Meter.toDp() を使用します。

rotate

rotate 修飾子は、指定されたコンポーザブルを空間内で回転させます。回転の方向と量は、さまざまな方法で指定できます。

  • ピッチ、ヨー、ロールを使用して、x 軸、y 軸、z 軸を中心とした回転をそれぞれ指定します。
  • axisAngle(回転軸を表す Vector3)と、その軸を中心に回転させる角度を使用します。
  • 回転を表す Quaternion を使用する。

rotateToLookAtUser

rotateToLookAtUser 修飾子は、コンテンツを継続的に回転させて、常にユーザーの方向を向くようにします。この修飾子を使用して、コンテンツが Y 軸上でユーザーに向かって回転し、直立して重力に沿った状態を維持する「ビルボード」効果を実現することもできます。これを行うには、rotateToLookAtUser 修飾子と gravityAligned 修飾子を組み合わせます。

コンポーザブルを移動、サイズ変更する

ユーザーが 3D 空間内のオブジェクトの位置とサイズを直接操作できるようにします。

要素を移動する

movable 修飾子が存在し、有効になっている場合、ユーザーが 3D 空間で要素を移動できるドラッグ可能な UI コントロールが表示されます。movable 修飾子は、Subspace 全体、空間レイアウト コンポーネント(SpatialRow や SpatialColumn など)、個々のコンポーネント(SpatialPanel や SpatialGltfModel など)に適用できます。

この移動の具体的な動作は、指定された movePolicy によって定義されます。

  • MovePolicy.Default(または MovePolicy.system()): システムが移動を完全に処理し、ユーザー入力に基づいて新しいポーズとスケールを自動的に計算して適用します。
  • MovePolicy.custom(): システムは入力に基づいてターゲット Pose を計算しますが、関連する要素に自動的に適用することはありません。これは、アプリで移動を制限したり、カスタム移動を作成したりする場合に便利です。
  • MovePolicy.anchor(): ユーザーが移動可能な要素を検出された現実世界の平面にスナップしてアンカーできるようにします。

アンカー コンポーザブル

移動可能なサブスペース コンポーザブルを現実世界のサーフェスに固定できるようにするには、MovePolicy.anchor() を movable 修飾子に渡します。このポリシーにより、ユーザーは要素(SpatialPanel や SpatialGltfModel など)をテーブル、壁、床などの物理的な面にスナップできます。

次のパラメータを使用して、要素をスナップできる検出された平面をフィルタできます(空のままにすると、要素は検出された任意の平面にアンカーできます)。

  • anchorPlaneOrientations: PlaneOrientation 値(Horizontal、Vertical、Any)のセット。
  • anchorPlaneSemantics: PlaneSemantic 値(Wall、Floor、Ceiling、Table、Any)のセット。

要素のサイズを変更する

resizable() 修飾子が存在し、有効になっている場合、ユーザーが 3D 空間で要素のサイズを変更できる UI コントロールが表示されます。サイズ変更の具体的な動作は、指定された resizePolicy によって定義されます。

  • ResizePolicy.default(): システムがサイズ変更ジェスチャーを自動的に処理し、新しいサイズをコンテンツに適用します。
  • ResizePolicy.custom(): システムは SpatialResizeEvent を提供し、サイズ変更の結果を関連する要素に自動的に適用しません。

コンポーザブルの外観を変更する

alpha

alpha 修飾子は、要素とその子の不透明度を設定します。0f は完全に透明、1.0f は完全に不透明であることを表します。

scale

scale 修飾子は、コンポーザブルのコンテンツを水平軸、垂直軸、奥行き軸に沿ってスケーリングします。

テストとユーザー補助

semantics

semantics 修飾子は、テストとユーザー補助機能で使用するために、セマンティクスをレイアウト ノードに追加します。Jetpack Compose のセマンティクスと SemanticsModifier をご覧ください。

testTag

testTag 修飾子は SemanticsPropertyReceiver.testTag の省略形であり、テスト フレームワークがテストで要素を見つけられるようにします。