最近到處搜集資料研究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 圖案轉化成一個具有深度(厚度)的三維幾何體。
材質,由於在3D建模工具中呈現球形,所以也叫材質球。上色,貼圖全靠它。
光源可以附加到節點上,在渲染場景中提供着色
虛擬攝像機可以附加到節點上,提供了一個場景的視圖。
了解以上知識,那我們就來動手開發吧,我們可以在Xcode 中新建一個SceneKit 項目:
運行效果如下:
這個新建的SceneKit 項目 里面會有一些示例代碼,我們接下來挑一些重要的注釋一下:
- SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
從 SCN 文件中加載一個場景,也可以從.dae 文件中加載
- SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];
獲得這個場景中飛機這個節點
- [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];
讓飛機一直繞着他的Y 軸旋轉
- scnView.allowsCameraControl = YES;
讓用戶可以控制攝像機,配合下面一句添加手勢的代碼,用戶可以放大,縮小 ,360 度旋轉整個場景
- gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];
- scnView.showsStatistics = YES; 控制下方的統計欄是否顯示
單擊手勢中:
- // check what nodes are tapped
- CGPoint p = [gestureRecognize locationInView:scnView];
- NSArray *hitResults = [scnView hitTest:p options:nil];
類似射線檢測,檢測二維這個點向深無限延深,這個射線上的節點,返回一個數組,可用於單擊選中,數組中第一個數據一般就是我們需要的節點。
- [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];
SceneKit 中的動畫區塊,類似 UIKit 中的動畫區塊。