美文网首页
AR初体验

AR初体验

作者: 木子心语 | 来源:发表于2017-09-05 14:44 被阅读0次

    首先打开Xcode-beta

    选择一个模板为你项目.png

    然后next为新项目选择选项

    为新项目选择选项.png

    创建项目

    创建项目.png

    项目创建后,先编译编译一下,会报错误,此时选择team,再进行编译就ok了.


    选择team.png
    art.scnassets

    包含两个文件:ship.scn和texture.png

    ship_scn.png texture_png.png
    main.storyboard
    在main.storyboard添加ARSCNView.png
    在main.storyboard添加ARSCNView,然后视图与ViewController.swift关联.
    
    Info.plist
    照相机使用描述.png
    如果是sigleView视图创建的应用,请在info.plist中加入Camera Usage Description,
    如果用AR模板创建的,会自动加入,无需担心.
    
    ViewController.swift
    示例:
    //导入所需要的库
    import UIKit
    import SceneKit
    import ARKit
    class ViewController: UIViewController, ARSCNViewDelegate {
        //关联sceneView
        @IBOutlet var sceneView: ARSCNView!
        override func viewDidLoad() {
            super.viewDidLoad()
            // 设置视图的代理
            sceneView.delegate = self
            // 显示统计fps和时间等信息
            sceneView.showsStatistics = true
            // 创建一个场景
            let scene = SCNScene(named: "art.scnassets/ship.scn")
            // 设置场景到视图
            sceneView.scene = scene
        }
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            // 创建一个session配置
            let configuration = ARWorldTrackingConfiguration()
            // 运行session
            sceneView.session.run(configuration)
        }
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            //停止视图session
            sceneView.session.pause()
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Release any cached data, images, etc that aren't in use.
        }
        // MARK: - ARSCNViewDelegate
    /*
        // Override to create and configure nodes for anchors added to the view's session.
        func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
            let node = SCNNode()
            return node
        }
    */
        func session(_ session: ARSession, didFailWithError error: Error) {
            // 向使用者发出一个错误信息   
        }
        func sessionWasInterrupted(_ session: ARSession) {
            // 通知用户会话已经中断
        }
        func sessionInterruptionEnded(_ session: ARSession) {
           //如果需要持续跟踪,重置跟踪或者删除已经存在的锚点
        }
    }
    
    接下来在原有代码上增加新功能

    首先我们在ViewWillAppear方法中,创建一个手势,

    let handGesutre=UITapGestureRecognizer(target:self,action:
    #selector(ViewController.handtap(getstureRecongnizer:)))
    view.addGestureRecognizer(handG);
    

    然后创建handG方法,

    @objc fun handtap(getstureR:UITapGestureRecognizer){
    }
    

    在方法中写入您的截屏操作,接下来我们一步一步来哦.
    首先呢,我们先判断一下,首先我们先判断一下是否在当前Frame

    guard let currentF = sceneView.session.currentFrame else {
    return 
    }
    

    接下来呢,我们创建一张图片Photo,

    let imageP = SCNPlane(width:sceneView.bounds.width /6000,
    height:sceneView.bounds.width/6000)
    

    创建完图片后,我们对图片进行渲染.对图片截图

    imageP.firstMaterial?.diffuse.contents = sceneView.snapshot()
    

    调整图片的亮度模式

    imageP.firstMaterial?.lightingModel = .constant
    

    接下来,我们创建一个节点,方便把图片显示在屏幕上

    let planNode = SCNNode(geometry:imageP)
    

    把节点添加到根节点

    sceneView.scene.rootNode.addChildNode(planNode)
    

    然后追踪相机的位置

    var translate = matrix_identity_float4x4
    

    在设置距离镜头10公分位置

    xyz轴.png

    从图中,可以屏幕的正前方是z轴的半轴

    translate.columns.3.z = -0.1
    

    改变节点位置

    planNode.simdTransform = matrix_multiply(currentFrame.camera.transform,translate)
    
    您试试吧,通过对屏幕的截屏,你可以在屏幕的正前方,可以看到飞机,点击屏幕后,可以看到一张图片悬浮在您屏幕的正前方.

    相关文章

      网友评论

          本文标题:AR初体验

          本文链接:https://www.haomeiwen.com/subject/fdsejxtx.html