- 废话不多说,先看效果
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); } }