ARkit是ios11新推出來的一個強大的AR框架痢甘,需要設備SE匀归、6s焙压、6ps拆融、7挺份、7p唆樊,就是需要A9處理器以上的設備杈笔,Xcode9.最低配置
用Xcode創(chuàng)建項目時鱼冀,會選擇SceneKit序六、SpriteKit任连、Metal
SceneKit:3D視圖
SpriteKit: 2D視圖
Metal:沒用過..但是必須是得用真機測試,不限制機型
剛創(chuàng)建好項目時例诀,會默認給你寫上很多代碼随抠,這些代碼就可以運行出一個飛機AR效果裁着,可是比較low。
-----------------------------------------------------------
ARSCNView:相當于是一個呈現AR效果的視圖
sceneView.showsStatistics = true //運行后視圖底部有FPS檢測拱她,true打開顯示二驰,false不顯示?
SCNScene:場景, 例如默認的飛機秉沼,直接設置顯示的場景
let scene = SCNScene(named: "art.scnassets/ship.scn")! ? ? ? "art.scnassets/ship.scn" 這個就是要加載的飛機資源
可以創(chuàng)建不同的幾何模型? 例如:
首先創(chuàng)建一個場景:
let scene = SCNScene()
然后創(chuàng)建一個幾何模型
let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0) ??
也可以創(chuàng)建球體SCNSphere? 桶雀,創(chuàng)建一個管SCNTube...很多
創(chuàng)建好之后,因為這個創(chuàng)建的是物品模型唬复,也就是節(jié)點矗积,所以要把自定義的物品放到節(jié)點上才能顯示 ?
let sphereNode = SCNNode(geometry: box) ?//創(chuàng)建節(jié)點,把盒模型添加進去
sphereNode.position = SCNVector3(0,0,-0.5) //設置節(jié)點的顯示位置
scene.rootNode.addChildNode(sphereNode) //把節(jié)點放到SCNScene的根節(jié)點上
sceneView.scene = scene ? //顯示盒子AR效果
顯示這個后是白色的敞咧,因為沒有渲染棘捣,創(chuàng)建渲染器
let material = SCNMaterial() // material 渲染器
material.diffuse.contents = UIColor.red //可以添加顏色 、添加圖片休建、添加視頻乍恐、添加gif圖
box.materials = [material] //渲染器添加到box中,可以添加多個
viewWillAppear中的這兩行代碼必須寫
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let configuration = ARWorldTrackingConfiguration()
sceneView.session.run(configuration)
}
也可以給view添加手勢,來創(chuàng)建多個
let topGesutre = UITapGestureRecognizer(target: self, action: #selector(ViewController.handtap(gestureRecognizer:)))
view.addGestureRecognizer(topGesutre)
@objc func handtap(gestureRecognizer:UITapGestureRecognizer){
guard let currentFrame = sceneView.session.currentFrame else {
return
}
//創(chuàng)建一張圖片
let image = SCNPlane(width: sceneView.bounds.width / 6000, height: sceneView.bounds.height / 6000)
image.firstMaterial?.diffuse.contents = sceneView.snapshot() //截屏
image.firstMaterial?.lightingModel = .constant
// ?創(chuàng)建節(jié)點
let node = SCNNode(geometry: image)
sceneView.scene.rootNode.addChildNode(node)
// ?追蹤相機的位置
var translate = matrix_identity_float4x4 ?//為4x4
translate.columns.3.z = -0.1 //3軸 z軸上相對于攝像頭往前10厘米
node.simdTransform = matrix_multiply(currentFrame.camera.transform, translate) //矩陣相乘
}
補充:播放視頻 要用到SpriteKit框架中的一個類SKVideoNode 參考 http://www.reibang.com/p/be06bf357564
http://www.reibang.com/p/bc5e6fb35410
let scene = SCNScene();
//創(chuàng)建幾何模型
let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
let shapre = SCNSphere(radius: 0.1)
//創(chuàng)建節(jié)點
let boxSCNNode = SCNNode(geometry: shapre)
boxSCNNode.position = SCNVector3Make(0, 0, -0.2)
scene.rootNode.addChildNode(boxSCNNode)
//創(chuàng)建視頻url
let url = Bundle.main.url(forResource: "ARKit視頻", withExtension: "mp4")
let nodeVideo = SKVideoNode.init(url: url!) //創(chuàng)建視頻節(jié)點
nodeVideo.size = CGSize(width: 1600, height: 900)
nodeVideo.position = CGPoint(x: nodeVideo.size.width/2, y: nodeVideo.size.height/2)
nodeVideo.zRotation = CGFloat(M_PI)
let skScene = SKScene() ?//創(chuàng)建視頻場景類
skScene.addChild(nodeVideo) //把視頻節(jié)點添加到場景中
skScene.size = nodeVideo.size
shapre.firstMaterial?.diffuse.contents = skScene //渲染球體
nodeVideo.play() ?//播放視頻
sceneView.scene = scene ?
sceneView.allowsCameraControl = true