美文网首页
ARKit学习记录1

ARKit学习记录1

作者: Cc大个子 | 来源:发表于2017-09-02 09:04 被阅读158次

    ARkit是ios11新推出来的一个强大的AR框架,需要设备SE、6s、6ps、7、7p,就是需要A9处理器以上的设备,Xcode9.最低配置

    用Xcode创建项目时,会选择SceneKit、SpriteKit、Metal

    SceneKit:3D视图

    SpriteKit: 2D视图

    Metal:没用过..但是必须是得用真机测试,不限制机型

    刚创建好项目时,会默认给你写上很多代码,这些代码就可以运行出一个飞机AR效果,可是比较low。

    -----------------------------------------------------------

    ARSCNView:相当于是一个呈现AR效果的视图

    sceneView.showsStatistics = true //运行后视图底部有FPS检测,true打开显示,false不显示 

    SCNScene:场景, 例如默认的飞机,直接设置显示的场景

    let scene = SCNScene(named: "art.scnassets/ship.scn")!       "art.scnassets/ship.scn" 这个就是要加载的飞机资源

    可以创建不同的几何模型  例如:

    首先创建一个场景:

    let scene = SCNScene()

    然后创建一个几何模型

    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)   

    也可以创建球体SCNSphere  ,创建一个管SCNTube...很多

    创建好之后,因为这个创建的是物品模型,也就是节点,所以要把自定义的物品放到节点上才能显示  

    let sphereNode = SCNNode(geometry: box)  //创建节点,把盒模型添加进去

    sphereNode.position = SCNVector3(0,0,-0.5) //设置节点的显示位置

    scene.rootNode.addChildNode(sphereNode) //把节点放到SCNScene的根节点上

    sceneView.scene = scene   //显示盒子AR效果

    显示这个后是白色的,因为没有渲染,创建渲染器

    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添加手势,来创建多个

    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

    }

    //创建一张图片

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

    image.firstMaterial?.diffuse.contents = sceneView.snapshot() //截屏

    image.firstMaterial?.lightingModel = .constant

    //  创建节点

    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.jianshu.com/p/be06bf357564

    http://www.jianshu.com/p/bc5e6fb35410

    let scene = SCNScene();

    //创建几何模型

    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)

    let shapre = SCNSphere(radius: 0.1)

    //创建节点

    let boxSCNNode = SCNNode(geometry: shapre)

    boxSCNNode.position = SCNVector3Make(0, 0, -0.2)

    scene.rootNode.addChildNode(boxSCNNode)

    //创建视频url

    let url = Bundle.main.url(forResource: "ARKit视频", withExtension: "mp4")

    let nodeVideo = SKVideoNode.init(url: url!) //创建视频节点

    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()  //创建视频场景类

    skScene.addChild(nodeVideo) //把视频节点添加到场景中

    skScene.size = nodeVideo.size

    shapre.firstMaterial?.diffuse.contents = skScene //渲染球体

    nodeVideo.play()  //播放视频

    sceneView.scene = scene  

    sceneView.allowsCameraControl = true

    相关文章

      网友评论

          本文标题:ARKit学习记录1

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