SceneKit: چیستان، صحنه‌های 3D و گراف صحنه

نویسنده: IT Sectr منتشر شده: 2026-05-03 زمان مطالعه: 10 دقیقه

SceneKit — چارچوب Apple برای کار با گرافیک 3D روی iOS، macOS و tvOS است که API ی سطح بالا برای ایجاد صحنه‌های سه‌بعدی بدون دانش OpenGL یا Metal فراهم می‌کند. از فیزیک، پویانمایی، روشنایی و یکپارچگی با ARKit پشتیبانی می‌کند. به گزارش Apple WWDC (2025)، SceneKit در بیش از 50 هزار برنامه و بازی استفاده می‌شود.

نکات کلیدی

  • SceneKit — چارچوب گرافیک 3D با گراف صحنه و رندر GPU
  • SCNScene — کانتینر ریشه حاوی درخت گره‌های SCNNode
  • SCNMaterial ظاهر شیئی را از طریق شیدرها و بافت‌ها تعیین می‌کند
  • موتور فیزیک SceneKit جاذبه، برخوردها و اتصالات را شبیه‌سازی می‌کند
  • یکپارچگی با ARKit و Metal ایجاد برنامه‌های AR با کارایی بالا را ممکن می‌سازد

SceneKit چیست؟

SceneKit — چارچوبی برای گرافیک 3D است که بخشی از SDK Apple بوده و در iOS 8 (2014) معرفی شد. SceneKit API ی کاملاً اسکریپتی را که بر روی Metal و OpenGL کار می‌کند برای ایجاد صحنه‌های تعاملی 3D فراهم می‌کند. چارچوب از واردات مدل‌ها در فرمت‌های Collada (DAE)، Alembic (ABC)، USD و GLTF از طریق Model I/O پشتیبانی می‌کند.

به دلیل متفاوت از APIهای سطح پایین (Metal, Vulkan)، SceneKit مدیریت رندر، روشنایی و فیزیک را به عهده می‌گیرد. توسعه‌دهنده صحنه را به صورت تصریحی توصیف می‌کند: گره‌ها را اضافه می‌کند، مواد و پویانمایی‌ها را تنظیم می‌کند. SceneKit به طور خودکار هندسه را بهینه می‌کند، draw calls را ادغام می‌کند و در صورت نیاز LOD را مدیریت می‌کند.

SceneKit می‌تواند همراه با ARKit برای نمایش اشیای 3D در دنیای واقعی و همچنین با Core ML برای بینایی ماشین و تجزیه و تحلیل صحنه کار کند. به گزارش Apple (2025)، آخرین نسخه SceneKit فقط از Metal API با پشتیبانی از Metal 3 و GPU Family 9 روی تراشهای Apple Silicon استفاده می‌کند.

تاریخچه SceneKit

SceneKit در macOS سال 2012 در چارچوب 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، تنظیمات پس‌زمینه (background)، منابع نور و دنیای فیزیک (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 — UIView برای نمایش SCNScene. ویژگی allowsCameraControl کنترل کاربر بر دوربین از طریق جست‌ها (جابجایی، چرخش، بزرگنمایی) را فعال می‌کند. برای اشکال‌زدایی، showsStatistics (FPS، draw calls، پولی‌گون‌ها) و debugOptions (wireframe، bounding boxes) در دسترس هستند.

در SwiftUI، SceneKit از طریق SceneView داخل می‌شود که SCNView را مخفی کرده و از پارامترهای صحنه پشتیبانی می‌کند. به گزارش Apple (2025)، SceneView از همان رندر Metal SCNView استفاده می‌کند بدون سربار اضافی بر پل بین SwiftUI و UIKit.

مواد، روشنایی و فیزیک در SceneKit

SCNMaterial تعیین می‌کند که سطح هندسه چگونه با نور تعامل می‌کند. SceneKit از PBR (Physically Based Rendering) از طریق SCNMaterial.LightingModel.physicallyBased که از پارامترهای roughness، metalness، albedo و normal استفاده می‌کند، پشتیبانی می‌کند. مواد PBR بدون تنظیم دستی برق در هر روشنایی واقعگرایانه به نظر می‌رسند.

SCNMaterial و بافت‌ها

SCNMaterial چند شکاف دارد: diffuse (رنگ/بافت)، specular (تابش آیینه‌ای)، normal (نقشه نرمال)، emission (تابندگی)، roughness (زبری) و metalness (فلزی بودن). هر شکاف می‌تواند UIColor، UIImage، CALayer یا SKScene برای بافت‌های پویا داشته باشد.

swift
// مواد PBR برای شیئی 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)

پارامترهای roughness 0.3 با metalness 0.8 موادی شبیه فلز صیقلی با پوشش مات ایجاد می‌کنند. برای عایق‌ها (چوب، پلاستیک) metalness روی 0 و برای فلزات نزدیک به 1.0 تنظیم می‌شود. مواد PBR به طور خودکار با روشنایی HDR صحنه سازگار می‌شوند.

روشنایی در SceneKit

SCNLight از چند نوع منابع نور پشتیبانی می‌کند: omni (نقطه‌ای)، directional (جهت‌دهی)، spot (نورافکن)، ambient (محیطی) و area (سطحی). هر منبع شدت (intensity)، رنگ (color) دارد و می‌تواند سایه بیندازد (castsShadow). SceneKit از طریق shadow maps سایه‌ها را به طور خودکار مدیریت می‌کند.

SceneKit از روشنایی HDR با فشردگی توانی (tone mapping) پشتیبانی می‌کند. ویژگی wantsHDR روی SCNView محدوده دینامیک گسترده را فعال می‌کند. ویژگی‌های دوربین: whitePoint، adaptativeLuminance و exposure تصویر را با روشنایی صحنه تطبیق می‌دهند و اثر نمایش فتوگرافیک ایجاد می‌کنند.

فیزیک SCNPhysicsBody

SCNPhysicsBody فیزیک اجسام صلب را شبیه‌سازی می‌کند: جاذبه، برخوردها و اصطکاک. انواع اجسام: .static (ثابت)، .dynamic (تحت تأثیر نیروها) و .kinematic (برنامه‌پذیری کنترل شده). شکل جسم توسط SCNPhysicsShape تعیین می‌شود که می‌تواند بر اساس هندسه گره یا شکلی ساده (box, sphere, concave polyhedron) باشد.

SCNPhysicsWorld فیزیک جهانی صحنه را مدیریت می‌کند: جاذبه (gravity)، سرعت شبیه‌سازی (speed) و تشخیص برخورد از طریق دلگات SCNPhysicsContactDelegate. SceneKit از اتصالات فیزیکی (SCNPhysicsHingeJoint، SCNPhysicsBallJoint، SCNPhysicsSliderJoint) برای ایجاد مکانیزم‌ها و اشیای متصل پشتیبانی می‌کند.

توسعه صحنه‌های 3D در SceneKit

توسعه در SceneKit معمولاً با بارگذاری مدل 3D از طریق Model I/O یا فایل .scn آغاز می‌شود. ویرایشگر صحنه در 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
// بارگذاری مدل 3D از طریق Model I/O
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)
}

پس از واردات، مدل را می‌توان از طریق CAAnimation کپی شده از MDLAnimation یا از طریق SCNTransaction برای تغییرات هموار ویژگی‌ها پویانمایی کرد. سیستم پویانمایی SceneKit از ادغام بین پویانمایی‌ها و همگامی با فیزیک برای ایجاد حرکات واقعگرایانه پشتیبانی می‌کند.

پویانمایی و ترانزاکشن‌ها

SCNTransaction به شما امکان می‌دهد تغییرات پارامترهای صحنه را در یک بلوک پویانمایی با زمان مشخص گروه‌بندی کنید. روش‌های begin() و commit() تغییرات را احاطه می‌دهند و duration زمان پویانمایی را تعیین می‌کند. ترانزاکشن‌های تودرتو برای پویانمایی‌های موازی با زمان‌های مختلف پشتیبانی می‌شوند. بلوک Completion پس از پایان پویانمایی اجرا می‌شود.

برای پویانمایی اسکلتی، SceneKit از SCNAnimation و SCNMorpher برای هدف‌های ادغام شکل (morph targets) پشتیبانی می‌کند. هر پویانمایی می‌تواند حلقه شده، در زمان مقیاس شود و از طریق additive blending با سایر پویانمایی‌ها مخلوط شود. به گزارش Apple (2025)، SceneKit از حداکثر 4 پویانمایی مخلوط به صورت همزمان بر روی یک اسکلت پشتیبانی می‌کند.

سیستم‌های ذرات SCNParticleSystem

SCNParticleSystem — سیستم ذرات داخلی برای ایجاد اثرات: دود، آتش، باران و شراره. ذرات می‌توانند از یک نقطه، کره، مکعب یا سطح هندسه گسیله شوند. پارامترها: birthRate، particleLifeSpan، speed، acceleration و colorOverLife. سیستم‌های ذرات برای حداکثر عملکرد روی GPU کار می‌کنند.

به گزارش Apple (2025)، SCNParticleSystem از حداکثر 100 هزار ذره با فرکانس 60 FPS روی دستگاه‌های A16+ پشتیبانی می‌کند. ذرات می‌توانند به برخوردها با اجسام فیزیکی صحنه واکنش نشان دهند. برای اثرات پیچیده، چند سیستم ذرات با پارامترهای مختلف قابل ترکیب و پیوند به گره‌های متحرک هستند.

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) از Location Anchors برای پیوند اشیای 3D به مختصات جغرافیایی و Room Tracking برای نقشه‌برداری فضاهای داخلی با جزئیات مبل پشتیبانی می‌کند.

تشخیص صفحات و قراردادن اشیاء

ARKit صفحات افقی و عمودی (کف‌ها، میزها، دیوارها) را از طریق دلگت didAdd/didUpdate/didRemove anchor تشخیص می‌دهد. گره SceneKit متصل به ARPlaneAnchor به طور خودکار موقعیت صفحه را در زمان واقعی ردیابی می‌کند. برای قراردادن اشیاء از روش hitTest روی ARSCNView یا raycastQuery استفاده می‌شود.

به گزارش Apple (2025)، حداکثر فاصله ردیابی ARKit روی A17 Pro در روشنایی 10 لوکس 50 متر است. SceneKit + ARKit تأخیر متحرک-به-فتون (motion-to-photon) کمتر از 20 میلی‌ثانیه را تامین می‌کند که برای بازی‌های AR و برنامه‌های صنعتی با انباره 3D بر روی تجهیزات واقعی حیاتی است.

پرسش‌های متداول

SceneKit چیست و برای چه استفاده می‌شود؟

SceneKit — چارچوب Apple برای گرافیک 3D که ایجاد صحنه‌های تعاملی سه‌بعدی را بدون برنامه‌نویسی سطح پایین ممکن می‌سازد. برای بازی‌ها، برنامه‌های AR، ویزوالیسازی داده‌ها و ویرایشگرهای 3D روی iOS، macOS و tvOS استفاده می‌شود.

تفاوت بین SceneKit و Metal چیست؟

SceneKit — API سطح بالا با رندر و فیزیک آماده، مناسب برای کارهای تیپیک 3D. Metal — API سطح پایین برای کنترل کامل بر GPU. SceneKit در داخل خود از Metal استفاده می‌کند و Metal برای اثرات رندرینگ سفارشی مناسب است.

SceneKit چه فرمت‌های مدل 3D را پشتیبانی می‌کند؟

SceneKit از طریق Model I/O از USD، USDZ، OBJ، STL، Collada (DAE)، Alembic (ABC)، PLY و GLTF پشتیبانی می‌کند. فرمت بومی — .scn (SceneKit Scene Format) بر پایه JSON. می‌توان از طریق SCNGeometry به صورت برنامه‌ای هندسه ایجاد کرد.

چگونه عملکرد SceneKit را بهینه کنیم؟

از LOD (Level of Detail) برای اشیای دور استفاده کنید، هندسه های با مواد مشترک را ادغام کنید، تعداد سایه‌ها و منابع نور را به 3–4 محدود کنید. برای ردیابی FPS و draw calls در زمان واقعی، Statistics را فعال کنید.

آیا می‌توان از SceneKit برای برنامه‌های AR استفاده کرد؟

بله، از طریق ARSCNView — افزونه SCNView برای ARKit. SceneKit صحنه 3D را به طور خودکار با دنیای واقعی همگام می‌کند و از تشخیص صفحات، چهره‌ها و تصاویر پشتیبانی می‌کند. این ساده‌ترین راه برای افزودن اشیای 3D در AR است.

نتیجه گیری

  • SceneKit — چارچوب Apple برای گرافیک 3D سطح بالا با رندر GPU از طریق Metal
  • SCNScene و SCNNode گراف صحنه را با وراثت تبدیلات تشکیل می‌دهند
  • SCNMaterial از رندر PBR با roughness، metalness و نقشه‌های normal پشتیبانی می‌کند
  • SCNPhysicsBody شبیه‌سازی فیزیک را با برخوردها و اتصالات تامین می‌کند
  • Model I/O مدل‌ها را در USD، OBJ، Collada و سایر فرمت‌ها وارد می‌کند
  • ARSCNView صحنه‌های 3D را از طریق ARKit با واقعیت افزوده یکپارچه می‌کند
  • SCNParticleSystem اثرات GPU را با میلیون‌ها ذره در زمان واقعی ایجاد می‌کند

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید