SceneKitは、iOS、macOS、tvOS向けの3Dグラフィックスを扱うためのAppleのフレームワークであり、OpenGLやMetalの知識がなくても3次元シーンを作成できる高レベルAPIを提供します。物理、アニメーション、照明、およびARKitとの統合をサポートしています。Apple WWDC(2025)によると、SceneKitは5万を超えるアプリケーションやゲームで使用されています。
重要なポイント
SceneKit は、Apple SDKの一部であり、iOS 8(2014)で導入された3Dグラフィックスフレームワークです。SceneKitは、MetalとOpenGL上で動作する完全なシーンベースのAPIを提供し、インタラクティブな3Dシーンを作成できます。フレームワークは、Model I/Oを介してCollada(DAE)、Alembic(ABC)、USD、GLTF形式のモデルインポートをサポートします。
低レベルAPI(Metal、Vulkan)とは異なり、SceneKitはレンダリング、照明、物理の管理を担当します。開発者は宣言的にシーンを記述し、ノードを追加し、マテリアルとアニメーションを設定します。SceneKit はジオメトリを自動的に最適化し、ドローコールをマージし、必要に応じてLODを管理します。
SceneKitは、現実世界に3Dオブジェクトを表示するためのARKit、およびマシンビジョンとシーン分析のためのCore MLと連携できます。Apple(2025)によると、SceneKitの最新バージョンはApple SiliconチップでMetal 3とGPU Family 9をサポートするMetal APIのみを使用します。
SceneKitは2012年にmacOSでOS X Mountain Lionの一部として登場し、当初はOpenGLを使用してレンダリングしていました。iOS 8のリリースにより、モバイルデバイスでも利用可能になりました。SceneKit 2.0(iOS 10)はPBRマテリアル、HDR照明、およびモデルインポートのためのModel I/Oとの統合を追加しました。
iOS 12ではSceneKitは完全にMetalに移行しました。iOS 15はUSDZ形式とAR Quick Lookのサポートを導入しました。iOS 18(2024)では、SceneKitはA17 ProおよびM4チップを搭載したデバイスでハードウェアアクセラレーテッドレイトレーシングをサポートし、モバイルデバイスでリアルタイムのリアルな影と反射を実現しました。
SceneKitのアーキテクチャ はシーングラフに基づいており、SCNSceneがルート要素で、SCNNodeの階層を含みます。各ノードは子ノードを持ち、ジオメトリ、カメラ、ライト、または物理ボディを含むことができます。ノードの位置は、左手座標系でSCNVector3(x、y、z)を介して設定されます。
SCNScene は3Dワールドのすべての状態(rootNode、背景設定、光源、物理ワールド(SCNPhysicsWorld))を含みます。シーンは.scnファイル(SceneKit Scene Format)からロードするか、プログラムで作成できます。.scn形式はオープンでJSONベースです。
import SceneKit
let scene = SCNScene()
scene.background.contents = UIColor.darkGray
// カメラの作成
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(0, 5, 10)
scene.rootNode.addChildNode(cameraNode)
// 物理演算付きキューブの作成
let box = SCNBox(width: 2, height: 2, length: 2, chamferRadius: 0)
let boxNode = SCNNode(geometry: box)
boxNode.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.dynamic,
shape: SCNPhysicsShape(geometry: box))
scene.rootNode.addChildNode(boxNode)
SCNCamera クラスは透視投影または正投影を設定します。パラメータ:fieldOfView(視野角、デフォルト45°)、zNear/zFar(近/遠クリッピングプレーン)。SceneKitはこれらのパラメータと画面アスペクト比に基づいて投影行列を自動的に管理します。
SCNNode はジオメトリ、トランスフォーム、物理ボディを接続します。ノードは空(他のノードのコンテナ)にすることも、geometryプロパティを介してジオメトリを含むこともできます。各ノードにはプログラムによる検索のための名前(name)があり、CAAnimationまたは事前定義されたSCNTransactionを介してアニメーション化できます。
ノードのトランスフォームは、position(SCNVector3)、rotation(SCNVector4)、scale(SCNVector3)プロパティを介して設定されます。複雑なトランスフォームには、transformプロパティ(SCNMatrix4)が使用されます。また、pivot(トランスフォームセンターオフセット)とworldPosition(階層に関係なくワールド空間での絶対位置)も使用できます。
SCNView はSCNSceneを表示するためのUIViewです。allowsCameraControlプロパティは、ジェスチャー(パン、回転、ズーム)によるカメラ制御を有効にします。デバッグには、showsStatistics(FPS、ドローコール、ポリゴン)とdebugOptions(ワイヤーフレーム、バウンディングボックス)が利用できます。
SwiftUIでは、SceneKitはSceneViewを介して埋め込まれ、SCNViewをラップしてシーンパラメータへのバインディングをサポートします。Apple(2025)によると、SceneViewはSCNViewと同じMetalレンダラーを使用し、SwiftUIとUIKitのブリッジによる追加オーバーヘッドはありません。
SCNMaterial はジオメトリの表面が光とどのように相互作用するかを定義します。SceneKitは、roughness、metalness、albedo、normalパラメータを使用するSCNMaterial.LightingModel.physicallyBasedを介したPBR(物理ベースレンダリング)をサポートします。PBRマテリアルは、手動のスペキュラ調整なしでどの照明下でもリアルに見えます。
SCNMaterial には複数のスロットがあります:diffuse(色/テクスチャ)、specular(鏡面反射)、normal(ノーマルマップ)、emission(発光)、roughness(粗さ)、metalness(金属性)。各スロットには、アニメーションテクスチャ用のUIColor、UIImage、CALayer、またはSKSceneを含めることができます。
// 3DオブジェクトのPBRマテリアル
let sphere = SCNSphere(radius: 1.5)
let material = SCNMaterial()
material.lightingModel = SCNMaterial.LightingModel.physicallyBased
material.diffuse.contents = UIColor.orange
material.roughness.contents = 0.3
material.metalness.contents = 0.8
sphere.materials = [material]
let sphereNode = SCNNode(geometry: sphere)
sphereNode.position = SCNVector3(0, 2, -5)
roughness 0.3 と metalness 0.8 のパラメータは、マット仕上げの研磨された金属に似たマテリアルを作成します。誘電体(木材、プラスチック)の場合はmetalnessを0に設定し、金属の場合は1.0に近い値に設定します。PBRマテリアルはシーンのHDR照明に自動的に適応します。
SCNLight は複数のタイプの光源をサポートします:omni(点光源)、directional(指向性)、spot(スポットライト)、ambient(環境光)、area(面光源)。各光源には強度(intensity)、色(color)があり、シャドウを投射できます(castsShadow)。SceneKitはシャドウマップを介して自動的にシャドウを管理します。
SceneKitはトーンマッピングによるHDR照明をサポートします。SCNViewのwantsHDRプロパティは拡張ダイナミックレンジを有効にします。カメラ属性:whitePoint、adaptativeLuminance、exposureは画像をシーンの明るさに適応させ、写真露出効果を生み出します。
SCNPhysicsBody は剛体物理(重力、衝突、摩擦)をシミュレーションします。ボディタイプ:.static(固定)、.dynamic(力の影響下)、.kinematic(プログラム制御)。ボディ形状はSCNPhysicsShapeを介して定義され、ノードのジオメトリまたは簡略化された形状(box、sphere、concave polyhedron)に基づくことができます。
SCNPhysicsWorld はシーンのグローバル物理(重力、シミュレーション速度、SCNPhysicsContactDelegateを介した衝突検出)を管理します。SceneKitはメカニズムと接続オブジェクトを作成するための物理ジョイント(SCNPhysicsHingeJoint、SCNPhysicsBallJoint、SCNPhysicsSliderJoint)をサポートします。
SceneKitでの開発 は通常、Model I/Oまたは.scnファイルを介した3Dモデルの読み込みから始まります。Xcodeのシーンエディタ(Scene Editor)では、コードなしで視覚的にオブジェクトを配置し、マテリアルと照明を設定できます。.scnファイルはJSON形式で保存され、gitによるバージョン管理をサポートします。
Model I/O(ModelIO.framework) は3Dモデルのインポート、エクスポート、処理のための強力なツールです。SceneKitはMDLAssetオブジェクトを直接使用し、それらをSCNSceneに変換できます。サポートされる形式:USD、USDZ、OBJ、STL、PLY、Collada(DAE)、Alembic(ABC)。アニメーションモデル(スケルタルアニメーション、モーフィング)もインポートできます。
// Model I/Oによる3Dモデルの読み込み
import ModelIO
let url = Bundle.main.url(forResource: "robot",
withExtension: "usdz")!
let asset = MDLAsset(url: url)
let scene = SCNScene(mdlAsset: asset)
// 設定のための名前によるノード検索
if let robot = scene.rootNode.childNode(
withName: "RobotArmature", recursively: true
) {
robot.position = SCNVector3(0, 0, -3)
}
インポート後、モデルはMDLAnimationからコピーされたCAAnimation、またはスムーズなプロパティ変更のためのSCNTransactionを介してアニメーション化できます。SceneKitのアニメーションシステムは、アニメーション間のブレンディングと、リアルな動きを作成するための物理との同期をサポートします。
SCNTransaction は、指定された期間のアニメーションブロックにシーンパラメータの変更をグループ化できます。begin()メソッドとcommit()メソッドが変更を囲み、durationがアニメーション時間を設定します。異なる期間の並行アニメーションのためにネストされたトランザクションがサポートされています。アニメーション完了後にcompletionブロックが実行されます。
スケルタルアニメーションの場合、SceneKitはブレンドシェイプ(モーフターゲット)のためのSCNAnimationとSCNMorpherをサポートします。各アニメーションはループ、タイムスケーリング、および加算ブレンディングを介した他のアニメーションとのブレンドが可能です。Apple(2025)によると、SceneKitは1つのスケルトンあたり最大4つの同時ブレンドアニメーションをサポートします。
SCNParticleSystem は、煙、火、雨、火花などのエフェクトを作成するための組み込みパーティクルシステムです。パーティクルは点、球、立方体、またはジオメトリ表面から放出できます。パラメータ:birthRate、particleLifeSpan、speed、acceleration、colorOverLife。パーティクルシステムは最大パフォーマンスのためにGPUで動作します。
Apple(2025)によると、SCNParticleSystem はA16+搭載デバイスで60 FPSで最大10万パーティクルをサポートします。パーティクルはシーンの物理ボディとの衝突に反応できます。複雑なエフェクトの場合は、異なるパラメータを持つ複数のパーティクルシステムを組み合わせて、移動するノードにアタッチできます。
SceneKit はARKitアプリケーションに推奨される高レベルフレームワークです。ARSCNViewはSCNViewを拡張し、仮想3Dワールドを実際の環境と自動的に同期します。画像分析、平面検出、顔追跡はARKitが実行し、レンダリングはSceneKitが実行します。
ARSCNView はすべてのSCNView機能をサポートしますが、シーンカメラをデバイスの実際のカメラに置き換えます。ARKitはカメラからのビデオを分析し、ARAnchorを作成します。SceneKitはこれらをSCNNodeに変換します。ARKitセッションはsessionプロパティを介して管理され、構成(ARWorldTrackingConfiguration、ARFaceTrackingConfiguration)で設定されます。
import ARKit
class ARViewController: UIViewController,
ARSessionDelegate {
let sceneView = ARSCNView()
override func viewDidLoad() {
super.viewDidLoad()
sceneView.session.run(
ARWorldTrackingConfiguration()
)
sceneView.autoenablesDefaultLighting = true
sceneView.delegate = self
}
}
autoenablesDefaultLighting プロパティは、実際の環境にマッチする組み込み照明を追加します。ARKit 6(iOS 18)は、3Dオブジェクトを地理座標にバインドするためのLocation Anchorsと、家具レベルの詳細で屋内空間をマッピングするためのRoom Trackingをサポートします。
ARKitはdidAdd/didUpdate/didRemoveアンカーデリゲートを介して水平面と垂直面(床、テーブル、壁)を検出します。ARPlaneAnchorにアタッチされたSceneKitノードは、リアルタイムで平面の位置を自動的に追跡します。オブジェクト配置には、ARSCNViewのhitTestメソッドまたはraycastQueryが使用されます。
Apple(2025)によると、A17 ProでのARKitの最大追跡距離は10ルクスの照度で50メートルです。SceneKit + ARKitは20ms未満のエンドツーエンドレイテンシ(motion-to-photon)を提供し、これはARゲームや実際の機器に3D指示オーバーレイを表示する産業用アプリケーションにとって重要です。
よくある質問
SceneKit は、低レベルプログラミングなしでインタラクティブな3次元シーンを作成できるAppleの3Dグラフィックスフレームワークです。iOS、macOS、tvOSでのゲーム、ARアプリケーション、データ可視化、3Dエディタに使用されます。
SceneKit は組み込みレンダラーと物理を備えた高レベルAPIで、一般的な3Dタスクに適しています。Metalは完全なGPU制御のための低レベルAPIです。SceneKitは内部でMetalを使用し、Metalはカスタムレンダリングエフェクトに適しています。
SceneKitはModel I/Oを介してUSD、USDZ、OBJ、STL、Collada(DAE)、Alembic(ABC)、PLY、GLTFをサポートします。ネイティブ形式はJSONベースの.scn(SceneKit Scene Format)です。SCNGeometryを介してプログラムでジオメトリを作成することもできます。
遠くのオブジェクトにはLOD(レベルオブディテール)を使用し、同じマテリアルのジオメトリをマージし、シャドウと光源を3〜4つに制限します。Statisticsを有効にして、リアルタイムでFPSとドローコールを監視します。
はい、ARSCNView(ARKit用のSCNViewの拡張)を介して使用できます。SceneKitは3Dシーンを現実世界と自動的に同期し、平面、顔、画像の検出をサポートします。ARに3Dオブジェクトを追加する最も簡単な方法です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。