SceneKit là framework của Apple để làm việc với đồ họa 3D trên iOS, macOS và tvOS, cung cấp API cấp cao để tạo cảnh ba chiều mà không cần biết OpenGL hay Metal. Nó hỗ trợ vật lý, hoạt ảnh, chiếu sáng và tích hợp với ARKit. Theo Apple WWDC (2025), SceneKit được sử dụng trong hơn 50 nghìn ứng dụng và trò chơi.
Các điểm chính
SceneKit là framework cho đồ họa 3D thuộc SDK Apple, được giới thiệu trong iOS 8 (2014). SceneKit cung cấp API hoàn toàn dựa trên cảnh hoạt động trên Metal và OpenGL để tạo cảnh 3D tương tác. Framework hỗ trợ nhập mô hình ở các định dạng Collada (DAE), Alembic (ABC), USD và GLTF qua Model I/O.
Không giống như các API cấp thấp (Metal, Vulkan), SceneKit xử lý việc kết xuất, chiếu sáng và vật lý. Nhà phát triển mô tả cảnh một cách khai báo: thêm nút, đặt vật liệu và hoạt ảnh. SceneKit tự động tối ưu hóa hình học, hợp nhất draw calls và quản lý LOD khi cần.
SceneKit có thể hoạt động cùng với ARKit để hiển thị đối tượng 3D trong thế giới thực, cũng như với Core ML cho thị giác máy tính và phân tích cảnh. Theo Apple (2025), phiên bản SceneKit mới nhất chỉ sử dụng API Metal với hỗ trợ Metal 3 và GPU Family 9 trên chip Apple Silicon.
SceneKit xuất hiện trên macOS vào năm 2012 trong OS X Mountain Lion và ban đầu sử dụng OpenGL để kết xuất. Với sự ra mắt của iOS 8, framework có sẵn trên thiết bị di động. SceneKit 2.0 (iOS 10) bổ sung hỗ trợ vật liệu PBR, chiếu sáng HDR và tích hợp với Model I/O để nhập mô hình.
Trong iOS 12, SceneKit chuyển hoàn toàn sang Metal. iOS 15 giới thiệu hỗ trợ định dạng USDZ và AR Quick Look. Với iOS 18 (2024), SceneKit nhận được tăng tốc phần cứng dò tia trên các thiết bị có chip A17 Pro và M4, cho phép bóng và phản chiếu chân thực theo thời gian thực trên thiết bị di động.
Kiến trúc SceneKit dựa trên đồ thị cảnh, trong đó SCNScene là phần tử gốc chứa hệ phân cấp các SCNNode. Mỗi nút có các nút con và có thể chứa hình học, máy ảnh, ánh sáng hoặc thân vật lý. Vị trí nút được đặt qua SCNVector3 (x, y, z) trong hệ tọa độ tay trái.
SCNScene chứa toàn bộ trạng thái của thế giới 3D: nút gốc rootNode, cài đặt nền, nguồn sáng và thế giới vật lý (SCNPhysicsWorld). Cảnh có thể được tải từ tệp .scn (SceneKit Scene Format) hoặc được tạo theo chương trình. Định dạng .scn là mở và dựa trên JSON.
import SceneKit
let scene = SCNScene()
scene.background.contents = UIColor.darkGray
// Tạo máy ảnh
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(0, 5, 10)
scene.rootNode.addChildNode(cameraNode)
// Tạo khối lập phương có vật lý
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)
Lớp SCNCamera cấu hình phép chiếu phối cảnh hoặc trực giao. Tham số: fieldOfView (góc nhìn, mặc định 45°), zNear/zFar (mặt phẳng cắt gần/xa). SceneKit tự động quản lý ma trận chiếu dựa trên các tham số này và tỷ lệ khung hình màn hình.
SCNNode kết nối hình học, phép biến đổi và thân vật lý. Các nút có thể trống (vùng chứa cho nút khác) hoặc chứa hình học qua thuộc tính geometry. Mỗi nút có tên (name) để tìm kiếm theo chương trình và có thể được tạo hoạt ảnh qua CAAnimation hoặc SCNTransaction được xác định trước.
Phép biến đổi nút được thiết lập qua các thuộc tính position (SCNVector3), rotation (SCNVector4) và scale (SCNVector3). Đối với phép biến đổi phức tạp, thuộc tính transform (SCNMatrix4) được sử dụng. Cũng có sẵn pivot — độ lệch trung tâm biến đổi, và worldPosition — vị trí tuyệt đối trong không gian thế giới không phụ thuộc vào hệ phân cấp.
SCNView là UIView để hiển thị SCNScene. Thuộc tính allowsCameraControl cho phép điều khiển máy ảnh bằng cử chỉ (di chuyển, xoay, thu phóng). Để gỡ lỗi, có sẵn showsStatistics (FPS, draw calls, đa giác) và debugOptions (khung dây, hộp giới hạn).
Trong SwiftUI, SceneKit được nhúng qua SceneView, bao bọc SCNView và hỗ trợ ràng buộc với tham số cảnh. Theo Apple (2025), SceneView sử dụng cùng trình kết xuất Metal như SCNView, không có chi phí bổ sung cho cầu nối giữa SwiftUI và UIKit.
SCNMaterial định nghĩa bề mặt hình học tương tác với ánh sáng như thế nào. SceneKit hỗ trợ PBR (Kết xuất dựa trên vật lý) qua SCNMaterial.LightingModel.physicallyBased, sử dụng các tham số roughness, metalness, albedo và normal. Vật liệu PBR trông chân thực dưới mọi ánh sáng mà không cần điều chỉnh phản chiếu thủ công.
SCNMaterial có nhiều khe: diffuse (màu/kết cấu), specular (phản chiếu gương), normal (bản đồ pháp tuyến), emission (phát sáng), roughness (độ nhám) và metalness (tính kim loại). Mỗi khe có thể chứa UIColor, UIImage, CALayer hoặc SKScene cho kết cấu hoạt ảnh.
// Vật liệu PBR cho đối tượng 3D
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)
Tham số roughness 0.3 với metalness 0.8 tạo vật liệu giống kim loại đánh bóng với lớp phủ mờ. Đối với chất điện môi (gỗ, nhựa), metalness được đặt thành 0, và đối với kim loại gần 1.0. Vật liệu PBR tự động thích ứng với chiếu sáng HDR của cảnh.
SCNLight hỗ trợ nhiều loại nguồn sáng: omni (điểm), directional (định hướng), spot (đèn chiếu), ambient (môi trường) và area (diện tích). Mỗi nguồn có cường độ (intensity), màu sắc (color) và có thể đổ bóng (castsShadow). SceneKit tự động quản lý bóng qua bản đồ bóng.
SceneKit hỗ trợ chiếu sáng HDR với nén tông màu (tone mapping). Thuộc tính wantsHDR trên SCNView kích hoạt dải động mở rộng. Thuộc tính máy ảnh: whitePoint, adaptativeLuminance và exposure thích ứng hình ảnh với độ sáng cảnh, tạo hiệu ứng phơi sáng nhiếp ảnh.
SCNPhysicsBody mô phỏng vật lý vật rắn: trọng lực, va chạm và ma sát. Các loại thân: .static (bất động), .dynamic (dưới tác động của lực) và .kinematic (điều khiển theo chương trình). Hình dạng thân được định nghĩa qua SCNPhysicsShape, có thể dựa trên hình học nút hoặc dạng đơn giản hóa (box, sphere, concave polyhedron).
SCNPhysicsWorld quản lý vật lý toàn cục của cảnh: trọng lực, tốc độ mô phỏng và phát hiện va chạm qua đại biểu SCNPhysicsContactDelegate. SceneKit hỗ trợ khớp nối vật lý (SCNPhysicsHingeJoint, SCNPhysicsBallJoint, SCNPhysicsSliderJoint) để tạo cơ cấu và đối tượng kết nối.
Phát triển trên SceneKit thường bắt đầu bằng cách tải mô hình 3D qua Model I/O hoặc tệp .scn. Trình chỉnh sửa cảnh trong Xcode (Scene Editor) cho phép sắp xếp đối tượng trực quan, cấu hình vật liệu và chiếu sáng mà không cần mã. Các tệp .scn được lưu ở định dạng JSON và hỗ trợ kiểm soát phiên bản qua git.
Model I/O (ModelIO.framework) là công cụ mạnh mẽ để nhập, xuất và xử lý mô hình 3D. SceneKit có thể trực tiếp sử dụng đối tượng MDLAsset, chuyển đổi chúng thành SCNScene. Các định dạng được hỗ trợ: USD, USDZ, OBJ, STL, PLY, Collada (DAE) và Alembic (ABC). Mô hình có hoạt ảnh (hoạt ảnh xương, biến dạng) cũng được nhập.
// Tải mô hình 3D qua Model I/O
import ModelIO
let url = Bundle.main.url(forResource: "robot",
withExtension: "usdz")!
let asset = MDLAsset(url: url)
let scene = SCNScene(mdlAsset: asset)
// Tìm nút theo tên để cấu hình
if let robot = scene.rootNode.childNode(
withName: "RobotArmature", recursively: true
) {
robot.position = SCNVector3(0, 0, -3)
}
Sau khi nhập, mô hình có thể được tạo hoạt ảnh qua CAAnimation sao chép từ MDLAnimation, hoặc qua SCNTransaction để thay đổi thuộc tính mượt mà. Hệ thống hoạt ảnh của SceneKit hỗ trợ pha trộn giữa các hoạt ảnh và đồng bộ hóa với vật lý để tạo chuyển động chân thực.
SCNTransaction cho phép nhóm các thay đổi tham số cảnh thành khối hoạt ảnh với thời lượng xác định. Các phương thức begin() và commit() bao quanh các thay đổi, và duration đặt thời gian hoạt ảnh. Các giao dịch lồng nhau được hỗ trợ cho hoạt ảnh song song với thời lượng khác nhau. Khối completion thực thi sau khi hoạt ảnh kết thúc.
Đối với hoạt ảnh xương, SceneKit hỗ trợ SCNAnimation và SCNMorpher cho blend shapes (morph targets). Mỗi hoạt ảnh có thể được lặp, chia tỷ lệ thời gian và pha trộn với các hoạt ảnh khác qua pha trộn cộng dồn. Theo Apple (2025), SceneKit hỗ trợ tới 4 hoạt ảnh pha trộn đồng thời trên mỗi bộ xương.
SCNParticleSystem là hệ thống hạt tích hợp để tạo hiệu ứng: khói, lửa, mưa và tia lửa. Các hạt có thể được phát ra từ điểm, hình cầu, hình khối hoặc bề mặt hình học. Tham số: birthRate, particleLifeSpan, speed, acceleration và colorOverLife. Hệ thống hạt chạy trên GPU để đạt hiệu suất tối đa.
Theo Apple (2025), SCNParticleSystem hỗ trợ tới 100 nghìn hạt ở 60 FPS trên thiết bị có A16+. Các hạt có thể phản ứng với va chạm với thân vật lý của cảnh. Đối với hiệu ứng phức tạp, nhiều hệ thống hạt với tham số khác nhau có thể được kết hợp và gắn vào các nút chuyển động.
SceneKit là framework cấp cao được ưa chuộng cho ứng dụng ARKit. ARSCNView mở rộng SCNView và tự động đồng bộ hóa thế giới 3D ảo với môi trường thực. Phân tích hình ảnh, phát hiện mặt phẳng và theo dõi khuôn mặt do ARKit thực hiện, trong khi kết xuất do SceneKit thực hiện.
ARSCNView hỗ trợ tất cả chức năng của SCNView nhưng thay thế máy ảnh cảnh bằng máy ảnh thực của thiết bị. ARKit phân tích video từ máy ảnh và tạo ARAnchor, SceneKit chuyển đổi thành SCNNode. Phiên ARKit được quản lý qua thuộc tính session, được cấu hình với cấu hình (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
}
}
Thuộc tính autoenablesDefaultLighting thêm chiếu sáng tích hợp phù hợp với môi trường thực. ARKit 6 (iOS 18) hỗ trợ Location Anchors để gắn đối tượng 3D vào tọa độ địa lý và Room Tracking để lập bản đồ không gian trong nhà với chi tiết đến mức đồ nội thất.
ARKit phát hiện mặt phẳng ngang và dọc (sàn, bàn, tường) qua đại biểu didAdd/didUpdate/didRemove anchor. Nút SceneKit gắn với ARPlaneAnchor tự động theo dõi vị trí mặt phẳng trong thời gian thực. Để đặt đối tượng, sử dụng phương thức hitTest trên ARSCNView hoặc raycastQuery.
Theo Apple (2025), khoảng cách theo dõi tối đa của ARKit trên A17 Pro là 50 mét ở độ rọi từ 10 lux. SceneKit + ARKit cung cấp độ trễ đầu cuối (motion-to-photon) dưới 20 ms, điều quan trọng cho trò chơi AR và ứng dụng công nghiệp với lớp phủ hướng dẫn 3D trên thiết bị thực.
Câu hỏi thường gặp
SceneKit là framework của Apple cho đồ họa 3D cho phép tạo cảnh ba chiều tương tác mà không cần lập trình cấp thấp. Nó được sử dụng cho trò chơi, ứng dụng AR, trực quan hóa dữ liệu và trình chỉnh sửa 3D trên iOS, macOS và tvOS.
SceneKit là API cấp cao với trình kết xuất và vật lý tích hợp, phù hợp cho các tác vụ 3D điển hình. Metal là API cấp thấp để kiểm soát GPU hoàn toàn. SceneKit sử dụng Metal bên trong, trong khi Metal phù hợp cho hiệu ứng kết xuất tùy chỉnh.
SceneKit qua Model I/O hỗ trợ USD, USDZ, OBJ, STL, Collada (DAE), Alembic (ABC), PLY và GLTF. Định dạng gốc là .scn (SceneKit Scene Format) dựa trên JSON. Có thể tạo hình học theo chương trình qua SCNGeometry.
Sử dụng LOD (Mức chi tiết) cho đối tượng xa, hợp nhất hình học có cùng vật liệu, giới hạn bóng và nguồn sáng ở mức 3–4. Bật Statistics để theo dõi FPS và draw calls theo thời gian thực.
Có, qua ARSCNView — phần mở rộng của SCNView cho ARKit. SceneKit tự động đồng bộ hóa cảnh 3D với thế giới thực, hỗ trợ phát hiện mặt phẳng, khuôn mặt và hình ảnh. Đây là cách dễ nhất để thêm đối tượng 3D vào AR.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm