找回密碼
 注冊帳號

掃一掃,訪問微社區

AR醬 ARKit從入門到精通(1)--顯示Cube(原生方法實現)

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

27

主題

248

帖子

1451

積分

Rank: 9Rank: 9Rank: 9

UID
156756
好友
11
蠻牛幣
1326
威望
0
注冊時間
2016-7-13
在線時間
484 小時
最后登錄
2019-8-14

專欄作家

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

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

x
本帖最后由 geekli 于 2019-7-15 14:20 編輯

?在全新AR開發專欄的第一篇我們通過一個簡單的project(在顯示環境放置一個cube)來了解ARKit的核心功能與API特性。通過這個過程,你將了解ARKit如何在真實的設備中工作,從而與創建的3D對象進行交互。

前提說明

1.本部分教程使用的是原生iOS開發,目前不涉及Unity,主要使用SceneKit。
2.使用的軟件版本:Xcode 9。
3.使用的開發語言版本:Swift 4
4.本系列專欄希望通過簡潔的語言與圖片幫助大家更好的理解ARKit開發流程,幫助大家開發出炫酷的AR應用。

Step 1: 創建項目

打開Xcode,點擊File > New > Project…,選擇Single View App,點擊Next創建項目,命名為ARKitDemo。如下圖操作所示:

設置SceneKit View

打開Main.storyboard,將ARKit SceneKit視圖拖放到視圖控制器上。

然后將ARKit SceneKit視圖約束填充整個視圖控制器。
Step 2: 編輯代碼實現open camera
連接IBOutlet

ViewController.swift文件的頂部添加一個import語句來導入ARKit:
[AppleScript] 純文本查看 復制代碼
import ARKit


然后按住control鍵并從ARKit SceneKit視圖拖拽到ViewController.swift文件。當提示時,命名IBOutlet sceneView。可以刪除didReceiveMemoryWarning() 方法,目前我們并不需要它。
配置ARSCNView Session

我們的AR應用程序是通過攝像頭觀察世界和周圍的環境。所以接下來我們需要設置Camera:

配置ARKit SceneKit View。在ViewController類中插入以下代碼:

[AppleScript] 純文本查看 復制代碼
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let configuration = ARWorldTrackingConfiguration()
    sceneView.session.run(configuration)
}


viewWillAppear(_:)方法中,我們初始化了一個名為ARWorldTrackingConfiguration的AR配置。主要用于實現World Tracking功能。關于WorldTracking,蘋果的官方API是這樣解釋的:

“World tracking provides 6 degrees of freedom tracking of the device. By finding feature points in the scene, world tracking enables performing hit-tests against the frame. Tracking can no longer be resumed once the session is paused.”

The World Tracking配置跟蹤設備的方向和位置,它還能通過設備的Camera探測真實世界的表面。

設置sceneView’s AR session來運行我們剛剛初始化的配置。AR session管理視圖內容的運動跟蹤和camera圖像處理。

現在在ViewController中添加另一個方法:

[AppleScript] 純文本查看 復制代碼
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    sceneView.session.pause()
}


在viewWillDisappear(_:)方法中主要處理:停止tracking和視圖內容的圖像。

Camera 授權

在我們運行應用程序之前,我們需要通知用戶我們將使用他們設備的攝像頭實現增強現實功能。這是iOS 10發布以來的一個要求。
打開Info.plist。右鍵單擊空白區域并選擇Add row。設置私隱相機使用說明鍵。值可以設置為Augmented Reality。如下圖所示:

接下來我們提前測試下Camera是否可以順利的調用出來。將測試手機連接到Mac上。在Xcode上構建并運行該項目。該應用程序應該會提示你允許攝像頭進入。如下圖所示:

Step 3: 添加3D物體

插入以下代碼到你的ViewControlle

[AppleScript] 純文本查看 復制代碼
func addBox() {
    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
    
    let boxNode = SCNNode()
    boxNode.geometry = box
    boxNode.position = SCNVector3(0, 0, -0.2)
    
    let scene = SCNScene()
    scene.rootNode.addChildNode(boxNode)
    sceneView.scene = scene
}


  • 創建一個Box,1 Float = 1 meter。
  • 創建一個node。node表示物體在三維空間中的位置和坐標。node本身沒有可見的內容。
  • 給node設置一個形狀(Box)。
  • 設置box的位置。這個位置相對于camera的,右邊是X正,左邊是X負。上面表示Y正,向下表示Y負。向后表示Z正,向前表示Z負。
  • 創建一個scene(SceneKit scene),將box添加到場景中去。
  • sceneView的scene設置為顯示剛剛創建的場景。


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


接下來Build,打開camera,出現白色的box,效果如下圖:

addBox()的方法也可以這樣寫:

[AppleScript] 純文本查看 復制代碼
func addBox() {
    let box = SCNBox(width: 0.05, height: 0.05, length: 0.05, chamferRadius: 0)
    
    let boxNode = SCNNode()
    boxNode.geometry = box
    boxNode.position = SCNVector3(0, 0, -0.2)
    
    sceneView.scene.rootNode.addChildNode(boxNode)
}


Step 4: 添加手勢(點擊刪除3D物體)
在ViewController.swift文件中插入以下方法:

[AppleScript] 純文本查看 復制代碼
@objc func didTap(withGestureRecognizer recognizer: UIGestureRecognizer) {
    let tapLocation = recognizer.location(in: sceneView)
    let hitTestResults = sceneView.hitTest(tapLocation)
    guard let node = hitTestResults.first?.node else { return }
    node.removeFromParentNode()
}


創建了一個didTap(帶有gesturerecognizer:)方法。檢索用戶相對于sceneView的點擊位置,然后t查看是否點擊了任何node。然后從hitTestResults中找到第一個node。如果結果確實包含至少一個node,那么我們將從其父節點刪除第一個節點。

在測試刪除對象之前,更新viewDidLoad()方法,添加對addTapGestureToSceneView()方法的調用:

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


Step 5: 添加多個3D物體

在ViewController類的末尾創建一個extension:

[AppleScript] 純文本查看 復制代碼
extension float4x4 {
    var translation: float3 {
        let translation = self.columns.3
        return float3(translation.x, translation.y, translation.z)
    }
}


extension將矩陣轉換為float3。修改addBox()方法:

[AppleScript] 純文本查看 復制代碼
func addBox(x: Float = 0, y: Float = 0, z: Float = -0.2) {
    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
    
    let boxNode = SCNNode()
    boxNode.geometry = box
    boxNode.position = SCNVector3(x, y, z)
    
    sceneView.scene.rootNode.addChildNode(boxNode)
}


修改didTap(使用gesturerecognizer:)方法,在guard let語句內部和return語句之前。添加以下代碼:

[AppleScript] 純文本查看 復制代碼
let hitTestResultsWithFeaturePoints = sceneView.hitTest(tapLocation, types: .featurePoint)
 
if let hitTestResultWithFeaturePoints = hitTestResultsWithFeaturePoints.first {
    let translation = hitTestResultWithFeaturePoints.worldTransform.translation
    addBox(x: translation.x, y: translation.y, z: translation.z)
}


接下來實現使用x、y和z在檢測到的點擊時添加一個新的box。didTap(withGestureRecognizer:)方法的代碼如下:

[AppleScript] 純文本查看 復制代碼
@objc func didTap(withGestureRecognizer recognizer: UIGestureRecognizer) {
    let tapLocation = recognizer.location(in: sceneView)
    let hitTestResults = sceneView.hitTest(tapLocation)
    guard let node = hitTestResults.first?.node else {
        let hitTestResultsWithFeaturePoints = sceneView.hitTest(tapLocation, types: .featurePoint)
        if let hitTestResultWithFeaturePoints = hitTestResultsWithFeaturePoints.first {
            let translation = hitTestResultWithFeaturePoints.worldTransform.translation
            addBox(x: translation.x, y: translation.y, z: translation.z)
        }
        return
    }
    node.removeFromParentNode()
}


運行效果如下圖:


參考鏈接:https://www.appcoda.com/arkit-introduction-scenekit/


------AR Portal(AR開發者社區)整理
關注微信公眾號(AR開發者交流社區,國內領先的AR開發者交流學習社區和AR內容平臺):AR開發者社區


回復

使用道具 舉報

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

本版積分規則

捕鱼王怎么进不去 259彩票靠谱吗 全天幸运飞艇七码计划 11选5龙虎是什么意思 宝彩娱乐app下载安装 江西时时开奖结果 天津时时开奖号码 分分pk10定位胆计划 谁有非凡炸金花网址 牛牛顺口溜 球探体育比分苹果 时时彩评测 重庆时时彩官方网站 北京pk彩票官网 1分快3计划 组选包胆 四川时时app下载手机版下载手机版下载手机版下载