zoukankan      html  css  js  c++  java
  • ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来

    • 废话不多说,先看效果
      • 由于是晚上,笔者选择的是一个台灯
        • 其实是会一直围着你转圈的,只不过笔者不好意思暴露家里的场景,所以请读者朋友们见谅~

    1.1-ARKit物体围绕相机旋转流程介绍

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

    • 2.实现物体的围绕相机旋转(这里主要会用到SceneKit框架中内容)

      • 注意:绕相机旋转的关键点在于:在相机的位置创建一个空节点,然后将台灯添加到这个空节点,最后让这个空节点自身旋转,就可以实现台灯围绕相机旋转
        • 1.为什么要在相机的位置创建一个空节点呢?因为你不可能让相机也旋转
        • 2.为什么不直接让台灯旋转呢? 这样的话只能实现台灯的自转,而不能实现公转
    • 核心代码介绍
      #pragma mark- 点击屏幕添加飞机
      - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
      {
          [self.planeNode removeFromParentNode];
          
          //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);
              
          }
          
          self.planeNode.position = SCNVector3Make(0, 0, -20);
          
          //3.绕相机旋转
          //绕相机旋转的关键点在于:在相机的位置创建一个空节点,然后将台灯添加到这个空节点,最后让这个空节点自身旋转,就可以实现台灯围绕相机旋转
          //1.为什么要在相机的位置创建一个空节点呢?因为你不可能让相机也旋转
          //2.为什么不直接让台灯旋转呢? 这样的话只能实现台灯的自转,而不能实现公转
          SCNNode *node1 = [[SCNNode alloc] init];
          
          //空节点位置与相机节点位置一致
          node1.position = self.arSCNView.scene.rootNode.position;
          
          //将空节点添加到相机的根节点
          [self.arSCNView.scene.rootNode addChildNode:node1];
          
          // !!!将台灯节点作为空节点的子节点,如果不这样,那么你将看到的是台灯自己在转,而不是围着你转
          [node1 addChildNode:self.planeNode];
          
          //旋转核心动画
          CABasicAnimation *moonRotationAnimation = [CABasicAnimation animationWithKeyPath:@"rotation"];
          
          //旋转周期
          moonRotationAnimation.duration = 30;
          
          //围绕Y轴旋转360度  (不明白ARKit坐标系的可以看笔者之前的文章)
          moonRotationAnimation.toValue = [NSValue valueWithSCNVector4:SCNVector4Make(0, 1, 0, M_PI * 2)];
          //无限旋转  重复次数为无穷大
          moonRotationAnimation.repeatCount = FLT_MAX;
          
          //开始旋转  !!!:切记这里是让空节点旋转,而不是台灯节点。  理由同上
          [node1 addAnimation:moonRotationAnimation forKey:@"moon rotation around earth"];
      }

       为了各位更加直观,且原博主代码有些方法属性已经废弃,我把我的demo上传上来。ARKit.zip

  • 相关阅读:
    C 文件随机读写
    fread(),fwrite()函数
    C 将文本文件内容逆序打印
    C++ 文件复制
    关机效果
    xpath的语法
    ajax json 数据
    转帖 ASP.NET中高级程序员 面试题
    数据库查询的执行顺序
    【转载】母版页引用外部文件的路径问题
  • 原文地址:https://www.cnblogs.com/weicyNo-1/p/8109154.html
Copyright © 2011-2022 走看看