找回密碼
 注冊帳號

掃一掃,訪問微社區

AR醬 ARKit從入門到精通(2)--顯示復雜模型

6
回復
661
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
2299
昨日變化

34

主題

262

帖子

1514

積分

Rank: 9Rank: 9Rank: 9

UID
156756
好友
11
蠻牛幣
998
威望
0
注冊時間
2016-7-13
在線時間
527 小時
最后登錄
2019-12-2

專欄作家

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
本帖最后由 geekli 于 2019-10-9 20:05 編輯

上部分(ARKit從入門到精通(1)--顯示Cube(原生方法實現))我們在Xcode顯示了一個最簡單的模型(cube),那么本部分主要實現在Xcode導入制作好的3D模型,使用ARKit在現實環境中顯示出來。

效果預覽:

3D模型資源:
https://pan.baidu.com/s/1Lrave2Km_DRims84yI8jmA  密碼:4769
原項目工程:
https://pan.baidu.com/s/12hAAC_EuTBvqIqz7Iwonxw  密碼:5tm0

本部分的教程直接在這個項目基礎上進行開發。

Step 1: 開發前準備

SceneKit支持兩種格式:SceneKit Scene (.scn)和Digital Asset Exchange (.dae)。Apple 官方對SceneKit對的解釋是:
SceneKit can read scene contents from a file in a supported format, or from an NSData object holding the contents of such a file.
Apple’s Documentation

打開Xcode導入剛剛下載好的項目并Build:


Step 2: 顯示單個3D物體

在ViewController類中插入以下方法:

[AppleScript] 純文本查看 復制代碼
func addPaperPlane(x: Float = 0, y: Float = 0, z: Float = -0.5) {
    guard let paperPlaneScene = SCNScene(named: "paperPlane.scn"), let paperPlaneNode = paperPlaneScene.rootNode.childNode(withName: "paperPlane", recursively: true) else { return }
    paperPlaneNode.position = SCNVector3(x, y, z)
    sceneView.scene.rootNode.addChildNode(paperPlaneNode)
}


上面的代碼中,我們首先使用paperPlane.scn初始化SCNScene對象。

接下來,我們初始化打開一個具有paperPlane節點名稱的SCNNode對象。將遞歸參數設置為true。

初始化節點之后,我們將paperPlaneNode的位置設置為x、y和z參數。默認位置是零向量。將z的默認值設置為-0.5,表示對象位于攝像機前面。

最后,paperPlaneNode添加到sceneView的根節點。

在viewDidLoad()方法中調用addPaperPlane(x:y:z:)方法:

[AppleScript] 純文本查看 復制代碼
override func viewDidLoad() {
    super.viewDidLoad()
    addPaperPlane()
}


接下來點擊運行。你會看到一架白紙飛機,效果如下圖:


運行測試會發現模型有些突兀,這是因為沒有加入Light,接下來實現在場景中加入光源。

Step 3: 添加光源

在ViewController類中,添加以下方法:

[AppleScript] 純文本查看 復制代碼
func configureLighting() {
    sceneView.autoenablesDefaultLighting = true
    sceneView.automaticallyUpdatesLighting = true
}


創建一個configureLighting()方法。在方法內部,我們將sceneView的autoenablesDefaultLighting屬性設置為true,SceneKit會自動向場景添加燈光。

接下來,將sceneView的automaticallyUpdatesLighting屬性也設置為true,視圖自動創建一個或多個SCNLight對象,將它們添加到場景中,并更新它們的屬性。如果想直接控制SceneKit場景中的所有照明,則需要將該值設置為false。

在viewDidLoad()方法中調用configureLighting()方法:

[AppleScript] 純文本查看 復制代碼
override func viewDidLoad() {
    super.viewDidLoad()
    configureLighting()
    addPaperPlane()
}


再次運行,會發現和第一次完全不同的效果:


Step 4: 顯示模型(車)
對于包含多個nodes的3D模型(比如文件中的小車模型),我們有不同于單個node模型(比如上面的飛機)的處理方法。


打開ViewController.swift文件,在addPaperPlane(x:y:z:)方法下插入以下代碼:
[AppleScript] 純文本查看 復制代碼
func addCar(x: Float = 0, y: Float = 0, z: Float = -0.5) {
    guard let carScene = SCNScene(named: "car.dae") else { return }
    let carNode = SCNNode()
    let carSceneChildNodes = carScene.rootNode.childNodes
        
    for childNode in carSceneChildNodes {
        carNode.addChildNode(childNode)
    }
        
    carNode.position = SCNVector3(x, y, z)
    carNode.scale = SCNVector3(0.5, 0.5, 0.5)
    sceneView.scene.rootNode.addChildNode(carNode)
}


現在注釋掉addPaperPlane()方法,并在viewDidLoad()方法中調用addCar()方法:
[AppleScript] 純文本查看 復制代碼
override func viewDidLoad() {
    super.viewDidLoad()
    configureLighting()
    //addPaperPlane()
    addCar()
}


接下來點擊運行,效果如下圖:





完整項目鏈接:
https://github.com/appcoda/ARKit3DDemo
參考資料:
https://www.appcoda.com/arkit-3d-object/


------AR Portal(AR開發者社區)整理
關注微信公眾:AR開發者社區
回復

使用道具 舉報

4四處流浪
308/500
排名
64938
昨日變化

0

主題

169

帖子

308

積分

Rank: 4

UID
143972
好友
0
蠻牛幣
234
威望
0
注冊時間
2016-3-30
在線時間
137 小時
最后登錄
2019-12-9
沙發
2019-10-12 08:42:44 只看該作者
感謝分享~~~~~~
回復

使用道具 舉報

0

主題

16

帖子

38

積分

Rank: 1

UID
281120
好友
0
蠻牛幣
4
威望
0
注冊時間
2018-5-14
在線時間
23 小時
最后登錄
2019-12-4
板凳
2019-10-17 11:22:13 只看該作者
學習一下
回復

使用道具 舉報

5熟悉之中
576/1000
排名
7135
昨日變化

6

主題

286

帖子

576

積分

Rank: 5Rank: 5

UID
234982
好友
0
蠻牛幣
1249
威望
0
注冊時間
2017-7-30
在線時間
114 小時
最后登錄
2019-11-15
地板
2019-10-19 17:56:42 只看該作者
ddddddddddddddddd
回復 支持 反對

使用道具 舉報

5熟悉之中
576/1000
排名
7135
昨日變化

6

主題

286

帖子

576

積分

Rank: 5Rank: 5

UID
234982
好友
0
蠻牛幣
1249
威望
0
注冊時間
2017-7-30
在線時間
114 小時
最后登錄
2019-11-15
5#
2019-10-21 11:00:52 只看該作者
dddddddddddddddd
回復 支持 反對

使用道具 舉報

3偶爾光臨
215/300

2

主題

122

帖子

215

積分

Rank: 3Rank: 3Rank: 3

UID
323131
好友
1
蠻牛幣
123
威望
0
注冊時間
2019-5-27
在線時間
91 小時
最后登錄
2019-12-11
6#
2019-10-23 17:47:24 只看該作者
好人一生平安
回復

使用道具 舉報

排名
64938
昨日變化

0

主題

11

帖子

16

積分

Rank: 1

UID
169072
好友
0
蠻牛幣
22
威望
0
注冊時間
2016-9-18
在線時間
3 小時
最后登錄
2019-12-4
7#
2019-11-28 16:43:18 只看該作者
謝謝分享!!!!!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

法甲球队主场名称