こんにちは!デバイスソフトウエア開発部の斎藤です。
エッジAIシステム開発と、iOSアプリケーション開発を担当しています。
普段はiPad ProのLiDARセンサーやARKit/RealityKitを活用したAR機能の開発に携わっているのですが、ARアプリや3Dグラフィックの開発において、地味にストレスになりがちなのが「3D空間の数学ロジック(ベクトル計算や回転計算)のデバッグ」です。
-
「2つのエンティティの相対角度の計算、符号逆になってないかな…?」
-
「レイキャストで取得した法線ベクトルから回転クォータニオンを作る計算、思い通りの向きになるか確かめたい」
こういった小さな計算ロジックを確かめるためだけに、毎回実機ビルドを走らせてカメラをデスクにかざすのは、開発効率の観点から見ても非常にもったいない時間ですよね。
そこで今回は、Xcode 26で登場した「#Playground マクロ」を活用し、プロダクションコード内で3D数学ロジックを即座にインライン検証・デバッグする開発ワークフローをご紹介します!
従来のデバッグ手法が抱えていた「地味なストレス」
これまでSwift開発で「ちょっとした関数の動作確認をしたい」となった場合、主に以下の2つのアプローチが使われていました。
-
実機・シミュレータでアプリを起動して
printやブレークポイントで確認する-
ARアプリの場合、起動待ち時間+ARセッションの初期化+実機でのカメラ操作が必要になり、たった1行の計算ミスを直すのにも数分単位のタイムロスが発生します。
-
-
プロジェクト内に別ファイルとして
.playgroundを作成する-
別ファイルに切り離すことでビルド時間は短縮できますが、アプリ本体で定義した独自の構造体やクラス、ユーティリティ関数を呼び出すための設定(ターゲットの共有など)が面倒になりがちです。
-
「アプリコードと同じファイル内で、同じ型を使いながら、ビルドなしで計算結果だけサクッとプレビューしたい…」
そんな開発者の切実な願いを叶えてくれたのが、Xcode 26の #Playground マクロ です。
「#Playground」マクロとは?
#Playground マクロは、Swift 6のマクロシステムとXcodeのCanvas表示を統合した新しい実験・検証機能です。
UIコンポーネントの見た目をプレビューする #Preview マクロの「ロジック・計算結果版」とイメージしていただくと分かりやすいかと思います。
主な特徴
-
プロダクションコード内に直接記述可能: 別途
.playgroundファイルを作る必要がありません。 -
同一ファイル・プロジェクトの型をそのまま参照: 自作のクラスや関数、
SIMD3やsimd_float4x4などの型をそのままテストできます。 -
Canvas上に即座に結果を表示: ソースコードを書き換えると自動的に再計算され、Canvas上に実行結果がリアルタイムで描画されます。
-
アプリの実行コードからは安全に分離: テスト用の
#Playgroundブロックはサンドボックス化されており、本番ビルドや製品の動作には悪影響を与えません。
実践:AR・3D数学ロジックをインラインでデバッグする
それでは、実際にiPad向けARアプリ開発でよく使われる「3D座標・ベクトル計算ロジック」を #Playground マクロで検証してみましょう。
シナリオ:ターゲット追従のための「視線ベクトルの内積判定」
「AR空間上に浮遊する3Dオブジェクトが、ユーザーのカメラ(視線)の方を向いているかどうかの判定」を行うロジックを作成します。
2つのベクトルの内積を計算し、なす角のコサイン値から正面度合いを算出するロジックを書いてみます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
import Foundation import simd import Playgrounds public struct ARMathUtils { /// カメラの視線ベクトルと対象オブジェクトの位置から、視界(正面)に入っているかを判定 public static func isTargetInFront( cameraPosition: SIMD3, cameraForward: SIMD3, targetPosition: SIMD3 ) -> (inFront: Bool, dotValue: Float) { let toTarget = targetPosition - cameraPosition // ゼロ除算対策 let length = simd_length(toTarget) guard length > 0 else { return (false, 0) } let normalizedToTarget = toTarget / length let dot = simd_dot(cameraForward, normalizedToTarget) // 内積0.8以上(前方約36度以内)を正面と定義 return (dot > 0.8, dot) } } #Playground("3D視線判定ロジックの動作検証") { // カメラ初期設定:原点(0,0,0)からZ軸奥(-1)を注視 let cameraPosition = SIMD3(0, 0, 0) let cameraForward = SIMD3(0, 0, -1) // Case 1: In Front let frontTarget = SIMD3(0.1, 0.1, -2.0) let frontResult = ARMathUtils.isTargetInFront( cameraPosition: cameraPosition, cameraForward: cameraForward, targetPosition: frontTarget ) print("Case 1 (In Front):", frontResult) // Case 2: Side let sideTarget = SIMD3(2.0, 0, 0) let sideResult = ARMathUtils.isTargetInFront( cameraPosition: cameraPosition, cameraForward: cameraForward, targetPosition: sideTarget ) print("Case 2 (Side):", sideResult) // Case 3: Behind let rearTarget = SIMD3(0, 0, 2.0) let rearResult = ARMathUtils.isTargetInFront( cameraPosition: cameraPosition, cameraForward: cameraForward, targetPosition: rearTarget ) print("Case 3 (Behind):", rearResult) } |
開発体験はどう変わるか?
上記コードを記述して Xcode のCanvasを開くだけで、アプリを実機やシミュレータにビルドすることなく、右側のプレビュー領域に print の実行結果が即座にフィードバックされます。
▲ コードを入力した瞬間に、右側のCanvasへ Case 1〜3 の判定結果が展開される
たとえば、「判定基準を36度(0.8)から60度(0.5)に変更したい」と思ったら、プロダクションコード側の閾値を書き換えるだけで、Canvas上の評価結果がミリ秒単位で再計算されます。
これにより、「実機に転送して、AR空間でオブジェクトを配置して、デバッグログを確認する」という従来なら数分かかっていたサイクルが、手元でキーボードを叩いた瞬間に完結するようになります。
クォータニオン(回転)やマトリクス計算のテストにも最適
3D開発で最もバグを生み出しやすい「回転(Quaternion)」や「4×4行列(Matrix)」の計算でも、この #Playground マクロは大活躍します。
例えば、「オイラー角からクォータニオンを生成し、ベクトルを回転させる処理」の検証も以下のようにその場で確認できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import Foundation import simd import Playgrounds #Playground("3D回転計算の検証") { // Y軸を中心に90度回転させるクォータニオン let angle = Float.pi / 2 // 90度 let rotation = simd_quatf(angle: angle, axis: SIMD3(0, 1, 0)) // Z軸奥に向かうベクトル (0, 0, -1) let forward = SIMD3(0, 0, -1) // ベクトルの回転適用 let rotatedVector = rotation.act(forward) print("Rotated Vector (Y-Axis 90°):", rotatedVector) } |
「Z軸奥を向いていたベクトルをY軸で90度まわしたら、X軸マイナス方向(左)を向いた」という計算結果がその場で一目瞭然になります。

▲ 右側Canvasの最下部を見ると、X成分が -1.0 に回転した結果が即座に確認できる
座標系の軸の向きや回転方向で混乱しやすい3D開発において、この「即時フィードバック」が得られる安心感は計り知れません!
まとめ
今回は #Playground マクロ を活用した、3D数学ロジックのデバッグ手法をご紹介しました!
-
実機ビルドなしでロジックをその場でプレビュー検証できる
-
別途
.playgroundファイルを作成・管理する手間が不要 -
プロダクションコードと同じ型やユーティリティ関数をそのまま動かせる
ARアプリ開発はもちろん、AIの推論結果のフォーマット処理、データ変換ロジック、正規表現のチェックなど、「ちょっとした計算ロジックを確信を持って書きたい」あらゆるシーンで絶大な威力を発揮します。
Xcodeでアプリ開発を行っている方はぜひ、手元のプロジェクトで import Playgrounds と #Playground を試してみてください!
最後までご覧いただきありがとうございました!

