ARKit从入门到精通(9)-ARKit让飞机跟着镜头飞起来

 

  • 废话不多说,先看效果

1.1-ARKit物体跟随相机移动流程介绍

  • 1.点击屏幕添加物体,已经在第三小节ARKit从入门到精通(3)-ARKit自定义实现中介绍

  • 2.监听ARSession的代理

    • 相机的移动是由AR会话来监听的
  • 3.在ARSession的相机移动代理中获取相机的当前位置,修改物体的位置与相机位置一致,即可实现物体跟随相机移动而移动

  • 核心代码介绍
  • - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        //1.使用场景加载scn文件(scn格式文件是一个基于3D建模的文件,使用3DMax软件可以创建,这里系统有一个默认的3D飞机)--------在右侧我添加了许多3D模型,只需要替换文件名即可
        SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
        //2.获取飞机节点(一个场景会有多个节点,此处我们只写,飞机节点则默认是场景子节点的第一个)
        //所有的场景有且只有一个根节点,其他所有节点都是根节点的子节点
        SCNNode *shipNode = scene.rootNode.childNodes[0];
        
        self.planeNode = shipNode;
    
        //飞机比较大,释放缩放一下并且调整位置让其在屏幕中间
        shipNode.scale = SCNVector3Make(0.5, 0.5, 0.5);
        shipNode.position = SCNVector3Make(0, -15,-15);
    
        //一个飞机的3D建模不是一气呵成的,可能会有很多个子节点拼接,所以里面的子节点也要一起改,否则上面的修改会无效
        for (SCNNode *node in shipNode.childNodes) {
            node.scale = SCNVector3Make(0.5, 0.5, 0.5);
            node.position = SCNVector3Make(0, -15,-15);
            
        }
        
        //3.将飞机节点添加到当前屏幕中
        [self.arSCNView.scene.rootNode addChildNode:shipNode];
    
    }
    - (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame
    {
        NSLog(@"相机移动");
    //    if (self.arType != ARTypeMove) {
    //        return;
    //    }
        //移动飞机
        if (self.planeNode) {
            
            //捕捉相机的位置,让节点随着相机移动而移动
            //根据官方文档记录,相机的位置参数在4X4矩阵的第三列
            self.planeNode.position =SCNVector3Make(frame.camera.transform.columns[3].x,frame.camera.transform.columns[3].y,frame.camera.transform.columns[3].z);
        }  
    } 
posted @ 2017-12-25 10:08  weicy  阅读(484)  评论(0编辑  收藏  举报