iOS - SceneKit 3D引擎初探


最近到處搜集資料研究3D最后還是決定鎖定OC框架,找到的學習資料隨后慢慢整理

 

 

SceneKit 是一個OC 框架,開始之前,先熟悉一下SceneKit 的三維坐標系:

很清楚的看到,SceneKit 中的坐標系是右手坐標系(笛卡爾坐標系),如果需要與其他3D框架共享數據,先了解其框架是右手坐標系還是左手坐標系。其實也很好轉化,就是Z 軸的正負不一樣而已。

 

在開始開發之前,一定要了解下面這幾個非常重要的類

 

SCNView &SCNSceneRenderer  

 

類似UIView,用來顯示 SceneKit 的內容,定義了一些代理方法,可以用 addSubView 方法添加到UiView

 

SCNScene 

 

SceneKit 內容的容器. 你可以從3D建模工具生成的.dae文件中加載一個場景,或者用代碼創建一個 ,然后把它顯示在視圖上

 

SCNNode    

一個場景的基本構建塊,你可以把攝像機,燈光,幾何體附加到節點上

 

SCNGeometry

 

一個可以連接到一個節點的三維物體。一個幾何體(有時稱為模型或網格)只定義了一個可見物體的形狀。要定義對象的表面顏色圖案,你必需要給幾何體要附加材料。

然后給材料貼圖,或者上色,這個幾何體表面才會有顏色,或者圖案。

SCNView &SCNSceneRenderer  

 

 類似UIView,用來顯示 SceneKit 的內容,定義了一些代理方法,可以用 addSubView 方法添加到UiView

 

SCNScene 

 

SceneKit 內容的容器. 你可以從3D建模工具生成的.dae文件中加載一個場景,或者用代碼創建一個 ,然后把它顯示在視圖上

 

SCNNode    

一個場景的基本構建塊,你可以把攝像機,燈光,幾何體附加到節點上

SCNGeometry

 

一個可以連接到一個節點的三維物體。一個幾何體(有時稱為模型或網格)只定義了一個可見物體的形狀。要定義對象的表面顏色圖案,你必需要給幾何體要附加材料。

然后給材料貼圖,或者上色,這個幾何體表面才會有顏色,或者圖案。

 

你可以從3D建模工具生成的.dae文件中加載一個幾何體,也可以用代碼創建,SceneKit 提供了幾種常見幾何體,是SCNGeometry 的子類,比如長方體,球,圓柱球等等,后面我們會寫一個demo會把官方提供的幾何體給大家列出來,給大家一個直觀的感受。 當然我們也可以用三維坐標,法向量自定義幾何體,也可以講一個2D 圖案轉化成一個具有深度(厚度)的三維幾何體。后面應該專門有一篇會講到利用貝塞爾曲線將一個2D 圖案轉化成一個具有深度(厚度)的三維幾何體。

 

SCNMaterial

 

材質,由於在3D建模工具中呈現球形,所以也叫材質球。上色,貼圖全靠它。


SCNLight

光源可以附加到節點上,在渲染場景中提供着色

 

SCNCamera

虛擬攝像機可以附加到節點上,提供了一個場景的視圖。

 

 

了解以上知識,那我們就來動手開發吧,我們可以在Xcode   中新建一個SceneKit 項目:

 

 

運行效果如下:

 

這個新建的SceneKit 項目 里面會有一些示例代碼,我們接下來挑一些重要的注釋一下:

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];  


從 SCN 文件中加載一個場景,也可以從.dae 文件中加載

 

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];  


獲得這個場景中飛機這個節點

 

 

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];  

 

 

讓飛機一直繞着他的Y  軸旋轉

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. scnView.allowsCameraControl = YES;  


讓用戶可以控制攝像機,配合下面一句添加手勢的代碼,用戶可以放大,縮小 ,360 度旋轉整個場景

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];  



[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. scnView.showsStatistics = YES;      控制下方的統計欄是否顯示  




 

單擊手勢中:

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. // check what nodes are tapped  
  2.     CGPoint p = [gestureRecognize locationInView:scnView];  
  3.     NSArray *hitResults = [scnView hitTest:p options:nil];  


    類似射線檢測,檢測二維這個點向深無限延深,這個射線上的節點,返回一個數組,可用於單擊選中,數組中第一個數據一般就是我們需要的節點。

 

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. [SCNTransaction begin];  
  2.    [SCNTransaction setAnimationDuration:0.5];  
  3.      
  4.    // on completion - unhighlight  
  5.    [SCNTransaction setCompletionBlock:^{  
  6.        [SCNTransaction begin];  
  7.        [SCNTransaction setAnimationDuration:0.5];  
  8.          
  9.        material.emission.contents = [UIColor blackColor];  
  10.          
  11.        [SCNTransaction commit];  
  12.    }];  
  13.      
  14.    material.emission.contents = [UIColor redColor];  
  15.      
  16.    [SCNTransaction commit];  


SceneKit 中的動畫區塊,類似 UIKit  中的動畫區塊。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM