馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。
您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號
x
本帖最后由 geekli 于 2019-10-9 20:05 編輯
效果預覽:
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開發者社區 |