SwiftUIで3Dモデルを表示する
SwiftUIで3Dモデルを表示する方法を探索しました。
目次
SwiftUIで3Dモデルを扱う技術選択
現在(2026年6月)SwiftUIで3Dモデルを扱うためには「RealityKit」を使用するようです。
従来は「SceneKit」を使用していたようですが、今は非推奨になっています。
他に「Model3D」というものもありますが、これはVisionOS用です。
「SpriteKit」 は、2D用のようです。
よって「RealityKit」を選択します。
- https://developer.apple.com/documentation/RealityKit RealityKit
- https://developer.apple.com/documentation/scenekit/ SceneKit
- https://developer.apple.com/documentation/realitykit/model3d/ RealityKit > Model3D
- https://developer.apple.com/documentation/SpriteKit SpriteKit
環境
開発環境
- Mac mini M4
- macOS Tahoe 26.5.1
- xcode 26.5
動作環境 Target
- iOS 18, 26
3Dモデル形式
RealityKitで使用するファイル形式は「USDZ」形式のファイルです。
「USDZ」形式ファイルを入手する
Apple公式に「USDZ」ファイルのサンプルが置いてあります。
https://developer.apple.com/jp/augmented-reality/quick-look
Blenderでも出力が可能。
File -> Export -> Universal Scene Description(.usd*)
export時のデフォルトのファイル拡張子が「*.usdc」なので「*.usdz」に変更して保存します。
今回はBlenderで出力したものを使用します。適当な青色の四角形を出力しました。ファイル名は「td1.usdz」です。
Reality Converter で変換する
BlenderでUSDZ形式ファイルを出力する方法
SwiftUI、RealityKit、RealityView向けに出力する方法です。
普通に出力してSwiftUIで表示すると座標軸が違うことに気づきます。Export時の設定を見直しましょう。
Export方法:
- File -> Export -> Universal Scene Description(.usd*)
- 出力するオブジェクトを選択しておく。
- オブジェクトを選択するとオレンジ色の枠で囲まれますね
Export設定:
- 「選択物のみ」をチェックする
- 「座標軸を変換」をチェックする
- 「前方の軸」を「-Z」に変更する
- 「上向きの軸」を「Y」に変更する
- 拡張子を「.usdc」から「.usdz」に変更する
3Dモデルの準備
3Dモデルファイル(.usdz)をxcodeのproject navigator(ファイルツリー)にD&Dしてください。
Assetsにはいれません。
swiftファイルと同じ扱いです。
コーディング
3Dモデルの表示
まずは表示するだけをやってみましょう。
3Dモデルのファイル名は「td1.usdz」です。
import SwiftUI
import RealityKit // 忘れずに!
struct Case1: View {
var body: some View {
RealityView { content in
if let entity = try? await Entity(named: "td1") {
// シーンへ追加
content.add(entity)
}
}
}
}
#Preview {
Case1()
}
表示されました。正面です。
位置調整
次にすこし位置を調整してみましょう。
RealityView { content in
if let entity = try? await Entity(named: "td1") {
// シーンへ追加
content.add(entity)
// 位置調整
// [x, y, z]
entity.position = [0.1, 0.1, -1]
}
}
すこし右上の奥に配置されました。
座標は、[x, y, z] で指定します。
座標系は以下です。右手座標系と呼ばれている様です。
- 横軸x(+方向は右)
- 縦軸y(上)
- 奥行きz(手前)
傾き
ずっと正面を向いていますね。少し傾けてみましょう。
RealityView { content in
if let entity = try? await Entity(named: "td1") {
// シーンへ追加
content.add(entity)
// 位置調整
entity.position = [0.1, 0.1, -1]
// 傾き
entity.transform.rotation = simd_quatf(
angle: .pi / 12,
axis: [1, 1, 1]
)
}
}
ちょっと傾きましたね。
対象の軸を中心に回転します。右回転します。
axis: [1, 1, 1] は、正規化されます。
自動回転
自動で回転させてアニメーションさせてみましょう。
RealityView { content in
if let entity = try? await Entity(named: "td1") {
// シーンへ追加
content.add(entity)
// 位置調整
entity.position = [0.1, 0.1, -1]
// 傾き
entity.transform.rotation = simd_quatf(
angle: .pi / 12,
axis: [1, 1, 1]
)
// 自動回転
_ = content.subscribe(to: SceneEvents.Update.self) { event in
// 毎秒45°回転
let angle = Float(event.deltaTime) * (.pi / 4)
entity.orientation *= simd_quatf(
angle: angle,
axis: [0, 1, 0]
)
}
}
}
以下Previewの様子です。
どうですか?回転しましたか?
スザンヌさんも回転できました。
おわり