iOS - SceneKit顯示與互動3D建模(一)
最近公司要求在手機上顯示3D模型,並且要獲取點選的模型座標,找了很多相關資料,發現有兩種實現方式,一種是整合Unity3D,另一種是使用蘋果提供的SceneKit;由於使用Unity3D太麻煩,於是選擇使用SceneKit,而且這個是原生的,速度可想而知要比整合U3D後執行要來得快~
SceneKit建立在 OpenGL 的基礎上,包含了如光照、模型、材質、攝像機等高階引擎特性。SceneKit實現的內容為節點層次結構樹,也被稱為場景圖。一個場景由一個為場景世界定義一個座標空間的根節點,以及其他的可視節點組成。SceneKit會在一個檢視上展示場景,而這個場景在GPU上�進行有效地渲染每一幀之前,會處理場景�資料圖和執行動畫。
�接著來來了解下座標吧,查閱蘋果官方文件,可以看到如下這張圖片,SceneKit使用的是右手座標系,預設檢視的方向是沿負Z軸方向的。可以簡單的記住紅色為x軸,綠色為y軸,藍色為z軸。
初出茅廬
我們先來建立一個遊戲工程
Game Technology選擇SceneKit
專案的目錄結構如下,比開發APP應用的專案多了一個scnassets資料夾,裡面有一個scn字尾的檔案,它是xcode能識別的�場景檔案。它支援一種字尾為dae的模型檔案,我們後續就會用到。
執行後如圖所示,真是有夠炫的,圖的下方顯示的是當前渲染相關資料,方便我們開發者檢視。
初窺門徑
程式碼從上至下的流程:
- 建立一個場景scene,場景本身並不可見,需要新增到sceneView的場景上
- 建立一個攝像機節點並設定擺放的位置,所處位置即視角所看的位置,可以聯想到眼睛視角
- 建立燈光節點設定擺放的位置,燈光可以讓需要呈現的物體變得更有質感。
- 獲取飛機模型,其中的【recursively:YES】意思為是否在子節點中查詢。
- 設定飛機模型繞著y軸旋轉,使用的是SCNAction,用法也很簡單。
- 獲取SCNView,並設定scnView。
牛刀小試
那接下來我們自己也搞一個工程來試試吧
在Link Binary With Libraries中引入SceneKit庫
在ViewController中匯入SceneKit
#import <SceneKit/SceneKit.h>
接下來在桌面上新建一個art資料夾,並加上字尾【.scnassets】,將我們的素材Menchi.dae放進裡面,然後把art.scnassets拖進專案中,接下來程式碼獻上
// �初始化一個場景
SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/Menchi.dae"];
// 取出場景中根結點的第一個結點(目錄根結點也就一個子結點,就是我們素材中的Menchi)
SCNNode *node = scene.rootNode.childNodes.firstObject;
// 繞 y軸 一直旋轉
SCNAction *action = [SCNAction repeatActionForever:[SCNAction rotateByX:0 y:1 z:0 duration:1]];
[node runAction:action];
// 素材放大5倍(由於我們素材的尺寸太小了)
node.transform = SCNMatrix4MakeScale(5, 5, 5);
// �建立一個攝像機並放入場景中
SCNNode *cameraNode = [SCNNode node];
cameraNode.camera = [SCNCamera camera];
[scene.rootNode addChildNode:cameraNode];
// �擺放攝像機位置
cameraNode.position = SCNVector3Make(0, 5, 15);
// 建立�燈光並放入場景中
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];
// 建立一個用來展示場景的SCNView
SCNView *scnView = [[SCNView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:scnView];
// 設定場景
scnView.scene = scene;
// 設定背景
scnView.backgroundColor = [UIColor blackColor];
// 允許控制攝像機位置
scnView.allowsCameraControl = YES;
// 顯示資料控制檯
scnView.showsStatistics = YES;
好了,編輯執行。成功執行
** BUT **,在實際專案中往往需要我們從伺服器上將模型下載下來再來顯示,然而這種做法只能是事先把素材放入專案中才能正常顯示,【注意:我說的是正常顯示】,這是不符合我們的需求的。如果我們把素材從伺服器上下載到沙盒裡,程式再直接從沙盒讀取和初始化場景會出現為nil的問題。
相關文章
- iOS SceneKit顯示與互動3D建模(二)iOS3D
- iOS 10 SceneKit 新特性 – SceneKit 製作 3D 場景框架iOS3D框架
- web 多屏互動顯示方案Web
- [SceneKit專題]19-MagicaVoxel的使用,3D體素網格建模3D
- ReactNative與iOS的互動ReactiOS
- iOS與H5互動iOSH5
- 3D遊戲:五、與遊戲世界互動3D遊戲
- iOS 與 JS 互動手冊 - JavaScriptCoreiOSJSJavaScript
- iOS 與JS Html常見互動iOSJSHTML
- JavaScript使網頁顯示動態效果並實現與使用者互動功能。JavaScript網頁
- Ehrenberg-Bass Institute:研究顯示Facebook僅1%粉絲與品牌互動
- AlloyTouch與three.js 3D模型互動JS3D模型
- iOS LaunchScreen.storyboard啟動白屏(不顯示)iOS
- RN互動iOSiOS
- iOS與JS互動之UIWebView-JavaScriptCore框架iOSJSUIWebViewJavaScript框架
- webView與js互動——獲取通訊錄手機號並顯示運營商WebViewJS
- [全程建模]互動建模和介面設計的區分詳釋
- Android程式啟動與Activity顯示Android
- iOS 隱藏&顯示tabBariOStabBar
- unity3d嵌入到iOS工程(3d物體和iOS控制元件顯示在同一個view上)Unity3DiOS控制元件View
- ReactNative iOS 互動ReactiOS
- iOS 使用 SceneKit 實現全景圖iOS
- iOS與JS互動之UIWebView協議攔截iOSJSUIWebView協議
- H5與安卓/IOS進行原生互動H5安卓iOS
- iOS 與 JS 互動開發知識總結iOSJS
- iOS開發:網頁JS與OC互動(JavaScriptCore)iOS網頁JSJavaScript
- iOS設定tabbar不顯示文字,只顯示圖片iOStabBar
- 新建模型的時候,是否顯示欄位中的條件顯示如何使用?模型
- 基於SceneKit的3D模型觸碰事件3D模型事件
- [SceneKit專題]18-Mac常用3D工具Mac3D
- flutter在IOS上顯示英文FlutteriOS
- iOS之LLDB列印顯示中文iOSLLDB
- iOS開發-javaScript互動iOSJavaScript
- 關於3D建模3D
- 【有獎互動】3D內容平臺開版啦,參與互動話題贏超值京東卡!3D
- 3D小遊戲(three)-分數顯示更新3D遊戲
- iOS呼叫系統相簿顯示英文標題,如何顯示中文呢?iOS
- FPGA影像採集與顯示專案(一)帶LOGO的VGA顯示模組FPGAGo