iOS 3D 之 SceneKit框架Demo分析

来源:http://www.cnblogs.com/jukaiit/archive/2016/08/04/5737242.html
-Advertisement-
Play Games

Scene Kit 是Apple 向 OS X 開發者們提供的 Cocoa 下的 3D 渲染框架。 Scene Kit 建立在 OpenGL 的基礎上,包含瞭如光照、模型、材質、攝像機等高級引擎特性,這些組件都是面向對象的,你可以用熟悉的 Objective-C 或 Swift 語言來編寫代碼。假如 ...


Scene Kit 是Apple 向 OS X 開發者們提供的 Cocoa 下的 3D 渲染框架。  

Scene Kit 建立在 OpenGL 的基礎上,包含瞭如光照、模型、材質、攝像機等高級引擎特性,這些組件都是面向對象的,你可以用熟悉的 Objective-C 或 Swift 語言來編寫代碼。假如你用過 OpenGL 最早的版本,那時還沒有 shader,只能苦逼的使用各種底層受限制的 API 開發。而 Scene Kit 就好了很多,對於大多數需求 (甚至像動態陰影等高級特性),使用它提供的上層 API 來配置,就已經足夠了。

創建一個項目:

 

 

 

在demo中比一般的文件多了一個scnasssets文件夾,這個是存放3d模型的文件夾,打開可以看到.scn尾碼的文件,這個就是xcode識別的模型文件尾碼的一種

 

 

    // create a new scene
    //創建一個場景scene
    SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
    
    //實例化SCNcene,場景本身並不可見,需要添加在SceneView的場景上
    //創建並添加一個相冊到scene
    //這段代碼是用來創建並配置攝像機。攝像機處於的位置即視角所看的位置。  註意這裡創建攝像機是創建了一個SCNNode,賦值了node的屬性。這裡需要瞭解一下node的作用。在SceneKit中,node即節點是非常關鍵的部分。node本身同樣是不可見的,它的作用是節點化各個部件。比如一輛車,車身和方向盤都是模型,可以把方向盤的node添加在車身模型的node上,這樣在車移動的時候,車模型的子node也會一起移動。車身各部件之間的相對位置是不變的。這樣可以大大節省工作量。在渲染場景的時候,sceneKit會遍歷所有的子node,cameraNode設置了屬性camera,並把自己添加在了scene的rootNode上才會在scene顯示的時候起作用
    
    // create and add a camera to the scene
    SCNNode *cameraNode = [SCNNode node];
    cameraNode.camera = [SCNCamera camera];
    [scene.rootNode addChildNode:cameraNode];
    
    //設置camera
    // place the camera
    cameraNode.position = SCNVector3Make(0, 0, 15);
    
    //代碼用來創建並配置燈光效果。在3d成像中,燈光是很重要的一個環節。燈光和陰影可以讓物體更有質感。light的type有四種,大家可以嘗試。
    //創建light到scene
    // create and add a light to the scene
    SCNNode *lightNode = [SCNNode node];
    lightNode.light = [SCNLight light];
    lightNode.light.type = SCNLightTypeOmni;
    lightNode.position = SCNVector3Make(0, 10, 10);
    [scene.rootNode addChildNode:lightNode];
    
    
    // create and add an ambient light to the scene
    SCNNode *ambientLightNode = [SCNNode node];
    ambientLightNode.light = [SCNLight light];
    ambientLightNode.light.type = SCNLightTypeAmbient;
    ambientLightNode.light.color = [UIColor darkGrayColor];
    [scene.rootNode addChildNode:ambientLightNode];
    
    
    //得到飛機模型。註意這個方法recursively:(BOOL)的意思為是否在子node中查詢。node是樹形結構,會返回第一個遇到的@“ship”node。
    // retrieve the ship node
    SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];
    
    
    //讓飛機繞y軸飛行。這裡的動畫是SCNAction,封裝性和使用方法與UIVIew的二維動畫類似,相當便捷。
    // animate the 3d object
    [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];
    
    //得到用於展示的SCNView,並配置scnView的scene。
    // retrieve the SCNView
    SCNView *scnView = (SCNView *)self.view;
    
    // set the scene to the view
    scnView.scene = scene;
    
    
    //設置允許用戶控制攝像機,顯示狀態,(fps等)一般是在開發中用作調試的
    
    // allows the user to manipulate the camera
    scnView.allowsCameraControl = YES;
        
    // show statistics such as fps and timing information
    scnView.showsStatistics = YES;
    
    // configure the view
    scnView.backgroundColor = [UIColor blackColor];
    
    //添加手勢
    // add a tap gesture recognizer
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    NSMutableArray *gestureRecognizers = [NSMutableArray array];
    [gestureRecognizers addObject:tapGesture];
    [gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];
    scnView.gestureRecognizers = gestureRecognizers;
    //這就是官方demo的基本內容。實現了一個模型的顯示和動畫。告訴了我們模型想變為可見,需要攝像機模擬視角,燈光和周圍燈光展示,添加在根node中。

 

- (void) handleTap:(UIGestureRecognizer*)gestureRecognize
{
    //去到SCNView
    // retrieve the SCNView
    SCNView *scnView = (SCNView *)self.view;
    
    //找到對應的node
    // check what nodes are tapped
    CGPoint p = [gestureRecognize locationInView:scnView];
    NSArray *hitResults = [scnView hitTest:p options:nil];
    
    // check that we clicked on at least one object
    if([hitResults count] > 0){
        // retrieved the first clicked object
        SCNHitTestResult *result = [hitResults objectAtIndex:0];
        
        // get its material
        SCNMaterial *material = result.node.geometry.firstMaterial;
        
        // highlight it
        [SCNTransaction begin];
        [SCNTransaction setAnimationDuration:0.5];
        
        // on completion - unhighlight
        [SCNTransaction setCompletionBlock:^{
            [SCNTransaction begin];
            [SCNTransaction setAnimationDuration:0.5];
            
            material.emission.contents = [UIColor blackColor];
            
            [SCNTransaction commit];
        }];
        
        material.emission.contents = [UIColor redColor];
        
        [SCNTransaction commit];
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 今天項目中做一個圖片效果展示,需要實時從後臺獲取圖片數據,前段做展示。想想用到隊列,比較好實現這個功能,只需要展示隊列里的數據就可以了。於是寫了個js 對列. js code 如果我們傳入 參數就會設置 隊列的大小,不設置隊列無窮大小 測試 不初始化隊列大小 //初始化沒有參數的隊列 var ...
  • <form>表單 name 表單的名稱 action 表單的提交地址 target 打開方式 enctype MIME類型 method 表單數據提交方式,get:在url地址上面傳送參數到伺服器,post:在後臺傳送參數到伺服器 <label> label元素不會向用戶呈現任何特殊效果,不過它為鼠 ...
  • For迴圈九九乘法表 for迴圈是javascript中一種常用的迴圈語句,可以很好的解決在程式中需要重覆執行某些語句,利用for迴圈實現簡單的“九九乘法表”的效果: 讓迴圈從小到大,依次排序,並計算每次的結果,並用 table 使之排列出來。 代碼很少,相對很簡單,也都是基礎,通過簡單的迴圈實現這 ...
  • jquery學習筆記 1.環境搭建 進入官方網站獲取最新的版本 http://jquery.com/download/ ,這裡需要註意 jQuery 分 2 個系列版本 1.x 與 2.x,主要的區別 在於 2.x 不再相容 IE6、7、8 為移動端而優化,由於減少了一些代碼,使得該版本比 jQue ...
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h RootViewController.m ...
  • 在上篇 Handler 原理分析和使用(一)中,介紹了一個使用Handler的一個簡單而又常見的例子,這裡還有一個例子,當然和上一篇的例子截然不同,也是比較常見的,實例如下。 實際運行這個例子,點擊Button之後,TextView文字內容會變成“I get Post Message”。為什麼會是這 ...
  • 作為一個完整的應用程式,數據存儲操作是必不可少的。因此,Android系統一共提供了四種數據存儲方式。分別是:SharePreference、文件存儲、SQLite、 Content Provider。對這幾種方式的不同和應用場景整理如下。第一種: 使用SharedPreferences存儲數據 適 ...
  • # 介紹1、官方文檔寫法```objcstatic AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allo... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...