SceneKit: 개념, 3D 장면 및 장면 그래프

저자: IT Sectr 게시일: 2026-05-03 읽는 시간: 10 분

SceneKit은 iOS, macOS 및 tvOS에서 3D 그래픽을 작업하기 위한 Apple의 프레임워크로, OpenGL이나 Metal에 대한 지식 없이 3차원 장면을 만들 수 있는 고수준 API를 제공합니다. 물리, 애니메이션, 조명 및 ARKit과의 통합을 지원합니다. Apple WWDC(2025)에 따르면 SceneKit은 5만 개 이상의 애플리케이션과 게임에서 사용됩니다.

핵심 요점

  • SceneKit — 장면 그래프와 GPU 렌더링을 갖춘 3D 그래픽 프레임워크
  • SCNScene — SCNNode 노드 트리를 포함하는 루트 컨테이너
  • SCNMaterial 셰이더와 텍스처를 통해 객체의 외관 정의
  • 물리 엔진 SceneKit은 중력, 충돌 및 조인트 시뮬레이션
  • ARKit 및 Metal과의 통합으로 고성능 AR 애플리케이션 제작 가능

SceneKit이란?

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의 역사

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 아키텍처: 장면 그래프와 노드

SceneKit 아키텍처는 장면 그래프를 기반으로 하며, SCNScene이 루트 요소로 SCNNode의 계층 구조를 포함합니다. 각 노드는 자식 노드를 가지며 지오메트리, 카메라, 조명 또는 물리 바디를 포함할 수 있습니다. 노드 위치는 왼손 좌표계에서 SCNVector3(x, y, z)를 통해 설정됩니다.

SCNScene — 루트 컨테이너

SCNScene은 3D 월드의 모든 상태(rootNode, 배경 설정, 광원, 물리 월드(SCNPhysicsWorld))를 포함합니다. 장면은 .scn 파일(SceneKit Scene Format)에서 로드하거나 프로그래밍 방식으로 생성할 수 있습니다. .scn 형식은 개방형이며 JSON 기반입니다.

swift
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 — 장면 노드

SCNNode는 지오메트리, 변환 및 물리 바디를 연결합니다. 노드는 비어 있거나(다른 노드의 컨테이너) geometry 속성을 통해 지오메트리를 포함할 수 있습니다. 각 노드에는 프로그래밍 방식 검색을 위한 이름(name)이 있으며 CAAnimation 또는 미리 정의된 SCNTransaction을 통해 애니메이션할 수 있습니다.

노드 변환은 position(SCNVector3), rotation(SCNVector4) 및 scale(SCNVector3) 속성을 통해 설정됩니다. 복잡한 변환에는 transform 속성(SCNMatrix4)이 사용됩니다. 또한 pivot(변환 중심 오프셋)과 worldPosition(계층 구조와 무관한 월드 공간의 절대 위치)을 사용할 수 있습니다.

SCNView — 렌더링

SCNView는 SCNScene을 표시하기 위한 UIView입니다. allowsCameraControl 속성은 제스처(이동, 회전, 확대/축소)를 통한 카메라 제어를 활성화합니다. 디버깅을 위해 showsStatistics(FPS, 드로우 콜, 폴리곤) 및 debugOptions(와이어프레임, 바운딩 박스)를 사용할 수 있습니다.

SwiftUI에서 SceneKit은 SceneView를 통해 임베드되며, SCNView를 래핑하고 장면 매개변수에 대한 바인딩을 지원합니다. Apple(2025)에 따르면 SceneView는 SwiftUI와 UIKit 간의 브리지에 대한 추가 오버헤드 없이 SCNView와 동일한 Metal 렌더러를 사용합니다.

SceneKit의 재질, 조명 및 물리

SCNMaterial은 지오메트리 표면이 빛과 어떻게 상호작용하는지 정의합니다. SceneKit은 roughness, metalness, albedo 및 normal 매개변수를 사용하는 SCNMaterial.LightingModel.physicallyBased를 통한 PBR(물리 기반 렌더링)을 지원합니다. PBR 재질은 수동으로 반사광을 조정하지 않아도 모든 조명에서 사실적으로 보입니다.

SCNMaterial 및 텍스처

SCNMaterial에는 여러 슬롯이 있습니다: diffuse(색상/텍스처), specular(반사광), normal(노멀 맵), emission(발광), roughness(거칠기) 및 metalness(금속성). 각 슬롯에는 애니메이션 텍스처를 위한 UIColor, UIImage, CALayer 또는 SKScene이 포함될 수 있습니다.

swift
// 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 조명에 자동으로 적응합니다.

SceneKit의 조명

SCNLight는 여러 유형의 광원을 지원합니다: omni(점광원), directional(방향성), spot(스포트라이트), ambient(환경광) 및 area(면광원). 각 광원은 강도(intensity), 색상(color)을 가지며 그림자를 드리울 수 있습니다(castsShadow). SceneKit은 섀도우 맵을 통해 그림자를 자동으로 관리합니다.

SceneKit은 톤 매핑을 통한 HDR 조명을 지원합니다. SCNView의 wantsHDR 속성은 확장된 동적 범위를 활성화합니다. 카메라 속성(whitePoint, adaptativeLuminance, exposure)은 이미지를 장면 밝기에 적응시켜 사진 노출 효과를 만듭니다.

SCNPhysicsBody 물리

SCNPhysicsBody는 강체 물리(중력, 충돌, 마찰)를 시뮬레이션합니다. 바디 유형: .static(고정), .dynamic(힘의 영향), .kinematic(프로그래밍 방식 제어). 바디 형태는 SCNPhysicsShape를 통해 정의되며, 노드 지오메트리 또는 단순화된 형태(box, sphere, concave polyhedron)를 기반으로 할 수 있습니다.

SCNPhysicsWorld는 장면의 글로벌 물리(중력, 시뮬레이션 속도, SCNPhysicsContactDelegate를 통한 충돌 감지)를 관리합니다. SceneKit은 메커니즘과 연결된 객체를 만들기 위한 물리 조인트(SCNPhysicsHingeJoint, SCNPhysicsBallJoint, SCNPhysicsSliderJoint)를 지원합니다.

SceneKit으로 3D 장면 개발

SceneKit 개발은 일반적으로 Model I/O 또는 .scn 파일을 통해 3D 모델을 로드하는 것부터 시작합니다. Xcode의 장면 편집기(Scene Editor)를 사용하면 코드 없이 시각적으로 객체를 배치하고 재질과 조명을 구성할 수 있습니다. .scn 파일은 JSON 형식으로 저장되며 git을 통한 버전 관리를 지원합니다.

3D 모델 가져오기

Model I/O(ModelIO.framework)는 3D 모델을 가져오고 내보내고 처리하기 위한 강력한 도구입니다. SceneKit은 MDLAsset 객체를 직접 사용하여 SCNScene으로 변환할 수 있습니다. 지원 형식: USD, USDZ, OBJ, STL, PLY, Collada(DAE) 및 Alembic(ABC). 애니메이션 모델(골격 애니메이션, 모핑)도 가져올 수 있습니다.

swift
// 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은 블렌드 셰이프(모프 타겟)를 위한 SCNAnimationSCNMorpher를 지원합니다. 각 애니메이션은 루프, 시간 스케일링 및 가산 블렌딩을 통한 다른 애니메이션과의 혼합이 가능합니다. Apple(2025)에 따르면 SceneKit은 골격당 최대 4개의 동시 블렌드 애니메이션을 지원합니다.

SCNParticleSystem 파티클 시스템

SCNParticleSystem은 연기, 불, 비, 불꽃 등의 효과를 만들기 위한 내장 파티클 시스템입니다. 파티클은 점, 구체, 큐브 또는 지오메트리 표면에서 방출될 수 있습니다. 매개변수: birthRate, particleLifeSpan, speed, acceleration, colorOverLife. 파티클 시스템은 최대 성능을 위해 GPU에서 실행됩니다.

Apple(2025)에 따르면 SCNParticleSystem은 A16+ 기기에서 60FPS로 최대 10만 개의 파티클을 지원합니다. 파티클은 장면의 물리 바디와 충돌에 반응할 수 있습니다. 복잡한 효과를 위해 다양한 매개변수를 가진 여러 파티클 시스템을 결합하여 움직이는 노드에 연결할 수 있습니다.

SceneKit과 ARKit: 증강 현실

SceneKit은 ARKit 애플리케이션을 위한 권장 고수준 프레임워크입니다. ARSCNView는 SCNView를 확장하고 가상 3D 세계를 실제 환경과 자동으로 동기화합니다. 이미지 분석, 평면 감지 및 얼굴 추적은 ARKit이 수행하고 렌더링은 SceneKit이 수행합니다.

ARSCNView 및 ARAnchor

ARSCNView는 모든 SCNView 기능을 지원하지만 장면 카메라를 기기의 실제 카메라로 대체합니다. ARKit은 카메라의 비디오를 분석하고 ARAnchor를 생성하며 SceneKit이 이를 SCNNode로 변환합니다. ARKit 세션은 session 속성을 통해 관리되며 구성(ARWorldTrackingConfiguration, ARFaceTrackingConfiguration)으로 설정됩니다.

swift
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이란 무엇이며 무엇에 사용되나요?

SceneKit은 저수준 프로그래밍 없이 대화형 3차원 장면을 만들 수 있는 Apple의 3D 그래픽 프레임워크입니다. iOS, macOS 및 tvOS에서 게임, AR 애플리케이션, 데이터 시각화 및 3D 편집기에 사용됩니다.

SceneKit과 Metal의 차이점은 무엇인가요?

SceneKit은 내장 렌더러와 물리를 갖춘 고수준 API로 일반적인 3D 작업에 적합합니다. Metal은 완전한 GPU 제어를 위한 저수준 API입니다. SceneKit은 내부적으로 Metal을 사용하며, Metal은 사용자 정의 렌더링 효과에 적합합니다.

SceneKit은 어떤 3D 모델 형식을 지원하나요?

SceneKit은 Model I/O를 통해 USD, USDZ, OBJ, STL, Collada(DAE), Alembic(ABC), PLY 및 GLTF를 지원합니다. 기본 형식은 JSON 기반의 .scn(SceneKit Scene Format)입니다. SCNGeometry를 통해 프로그래밍 방식으로 지오메트리를 만들 수 있습니다.

SceneKit 성능을 최적화하는 방법은?

먼 객체에는 LOD(레벨 오브 디테일)를 사용하고, 동일한 재질의 지오메트리를 병합하며, 그림자와 광원을 3~4개로 제한하세요. Statistics를 활성화하여 실시간으로 FPS와 드로우 콜을 모니터링하세요.

AR 애플리케이션에 SceneKit을 사용할 수 있나요?

네, ARSCNView(ARKit용 SCNView 확장)를 통해 사용할 수 있습니다. SceneKit은 3D 장면을 실제 세계와 자동으로 동기화하고 평면, 얼굴 및 이미지 감지를 지원합니다. AR에 3D 객체를 추가하는 가장 쉬운 방법입니다.

요약

  • SceneKit — Metal을 통한 GPU 렌더링으로 고수준 3D 그래픽을 위한 Apple 프레임워크
  • SCNSceneSCNNode가 변환 상속을 가진 장면 그래프를 형성
  • SCNMaterial이 roughness, metalness 및 normal 맵으로 PBR 렌더링 지원
  • SCNPhysicsBody가 충돌 및 조인트를 통한 물리 시뮬레이션 제공
  • Model I/O가 USD, OBJ, Collada 및 기타 형식의 모델 가져오기
  • ARSCNView가 ARKit을 통해 3D 장면을 증강 현실과 통합
  • SCNParticleSystem이 실시간으로 수백만 개의 파티클로 GPU 효과 생성

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기