アプリにサブスペースを追加する

サブスペースは、アプリ内の 3D 空間のパーティションで、3D モデルを配置したり、3D レイアウトを作成したり、2D コンテンツに奥行きを追加したりできます。サブスペースは、空間化が有効になっている場合にのみレンダリングされます。ホーム スペースまたは XR 以外のデバイスでは、そのサブスペース内のコードは無視されます。

3D モデルを配置するには、VolumeSpatialPanel などの @SubspaceComposable を使用できます。OrbiterSpatialDialog などの XR コンポーネントは、2D UI 階層のどこでも使用できる標準の 2D コンポーザブルですが、SubspaceComposable はアプリのサブスペースで呼び出す必要があります。これを行うには、Subspace コンポーザブルを使用します。

他のコンポーザブルと同様に、2D UI 階層で Subspace を直接呼び出すことができます。ただし、Subspace を呼び出す階層内の場所が持つ意味を理解しておくことが重要です。

サブスペース階層について

最上位のサブスペースは、アプリによって呼び出される最も外側のサブスペースです。このサブスペースの境界は事実上無限であり、通常はアプリの空間レイアウトと SpatialPanel を配置します。

ただし、トップレベルのサブスペースに含まれるパネルの 2D UI 階層内に別のサブスペースをネストすると、そのネストされたサブスペースの動作は異なります。

ネストされたサブスペースには、トップレベルの Subspace と次の 2 つの主な違いがあります。

  • 呼び出された 2D レイアウトに参加します。つまり、サブスペースの高さと幅は、2D 親レイアウトの高さと幅によって制限されます。
  • 呼び出されたエンティティの子として動作します。つまり、SpatialPanel 内にネストされた Subspace コンポーザブルを呼び出すと、そのサブスペースは、呼び出された SpatialPanel の子になります。

ネストされたサブスペースのこれらの動作により、次のような機能が有効になります。

  • 親エンティティとともに子を移動する
  • オフセット SubspaceModifier を使用して子の位置をオフセットする
  • 2D UI の上にホバーし、2D レイアウト内の適切なスペースの高さと幅と一致する 3D オブジェクトを表示する

アプリにサブスペースを追加する

次のコードサンプルは、トップレベルとネストされたサブスペースをアプリに追加する方法を示しています。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    enableEdgeToEdge()
    setContent {
        // This is a top-level subspace
        Subspace {
            SpatialPanel {
                MyComposable()
            }
        }
    }
}
@Composable
private fun MyComposable() {
    Row {
        PrimaryPane()
        SecondaryPane()
    }
}
@Composable
private fun PrimaryPane() {
      ...
    // This is a nested subspace, because PrimaryPane is in a SpatialPanel
    // and that SpatialPanel is in a top-level Subspace
    Subspace {
        ObjectInAVolume(show3DObject)
    }
      ...
}