ARKit初体验

2017-10-20  本文已影响71人  一朝风月

第一:什么是AR

第二:开发AR

创建工程

选择AR.png 点击Next
WX20171018-180443@2x.png 在Content Technology中,有三个选项:
最后点击next创建好工程:

运行后会通过摄像机看到有一个3D的立体模型出现在眼前, 再看代码:

class ViewController: UIViewController, ARSCNViewDelegate {//VC遵循ARSCNView代理
    @IBOutlet var sceneView: ARSCNView! 
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        //Show statistics such as fps and timing information
        sceneView.showsStatistics = true
        
        // Create a new scene
        let scene = SCNScene(named: "art.scnassets/ship.scn")!
        
        // Set the scene to the view
        sceneView.scene = scene
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // Create a session configuration
        let configuration = ARWorldTrackingConfiguration()
        
        
        // Run the view's session
        sceneView.session.run(configuration)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        // Pause the view's session
        sceneView.session.pause()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    }
}
通过代码了解一些基本概念。
通过代码和概念:可以总结启动AR的步骤:
  1. 通过ARSCNView加载SCNScene场景;
  2. SCNScene启动相机ARCamera捕捉现实场景;
  3. 捕捉场景后ARSCNView将场景数据传递给ARSession;
  4. ARSession通过管理ARSessionConfiguration实现场景追踪;
  5. 给ARSCNView的scene添加一个子节点(3D物体模型);

写一个简单Demo, AR播放视频

  1. 给一个本地的视频url:
override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the view's delegate
        sceneView.delegate = self
        
        sceneView.showsStatistics = false;
        
        //本地视频URL
        let bundlePath = Bundle.main.url(forResource: "驯龙记.mp4", withExtension: nil)
        
        //首先创建一个创景:
        let scene = SCNScene()

        //创建一个平面的几何
        let plane = SCNPlane.init(width: 0.664, height: 0.375);
        
        //初始一个渲染器
        let materials = SCNMaterial()
        
        //创建player
        let player = AVPlayer.init(url: bundlePath!)
        
        //渲染器扩散接受内容
        materials.diffuse.contents = player
        
        //设置渲染器
        plane.materials = [materials]
        
        //设置节点
        let node = SCNNode(geometry: plane)
        
        //节点位置
        node.position = SCNVector3(0, 0, -1.0)
        
        //设置根节点
        scene.rootNode.addChildNode(node);
        
        //播放
        player.play()
        
        sceneView.scene = scene
        
    }
完成

其中

node.position = SCNVector3(0, 0, -1.0)

坐标z轴, 正值朝向观察者, 负值是正面可以观察到的;

渲染器接受到的内容:

materials.diffuse.contents  = ?
//可以是一种颜色(NSColor,UIColor,CGcolorRef)
//可以是图像(NSImage, UIImage, CGImageRef)
//可以是CALayer
//可以是路径 (NSString or NSURL)
//可以是场景SKScene  SKTexture
 //可以是二维码: AVCaptureDevice;( iOS 11以上)
//可以是AVPlayer;
//设置颜色的动画

上一篇 下一篇

猜你喜欢

热点阅读