• ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来


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

    • 1.2-完整代码 

    • 1.3-代码下载地址

    • 废话不多说,先看效果 

      ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来 ARKit教程 第1张

      • 其实是会一直围着你转圈的,只不过笔者不好意思暴露家里的场景,所以请读者朋友们见谅~

      • 由于是晚上,笔者选择的是一个台灯 

    ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来 ARKit教程 第2张

    1101.gif 

     

    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:@"Models.scnassets/lamp/lamp.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"];
    //3D游戏框架
    #import <SceneKit/SceneKit.h>
    //ARKit框架 #import <ARKit/ARKit.h>
    @interface ARSCNViewViewController ()<ARSCNViewDelegate,ARSessionDelegate>
    //AR视图:展示3D界面 @property(nonatomic,strong)ARSCNView *arSCNView;
    //AR会话,负责管理相机追踪配置及3D相机坐标 @property(nonatomic,strong)ARSession *arSession;
    //会话追踪配置:负责追踪相机的运动 @property(nonatomic,strong)ARSessionConfiguration *arSessionConfiguration;
    //飞机3D模型(本小节加载多个模型) @property(nonatomic,strong)SCNNode *planeNode;
    @end
    @implementation ARSCNViewViewController
    - (void)viewDidLoad {
      [super viewDidLoad]; // Do any additional setup after loading the view.
    }
    - (void)back:(UIButton *)btn{
      [self dismissViewControllerAnimated:YES completion:nil];
    }
    - (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    //1.将AR视图添加到当前视图 [self.view addSubview:self.arSCNView];
    //2.开启AR会话(此时相机开始工作) [self.arSession runWithConfiguration:self.a

     

     

  • 相关阅读:
    &lt;Android&gt;greenrobot-EventBus,guava-Event Bus的异步实现
    MySQL Study之--MySQL用户及权限管理
    关于Apacheserver的訪问控制
    Jquery改动页面标题title其他JS失效
    P3742 umi的函数
    P3717 [AHOI2017初中组]cover
    P2261 [CQOI2007]余数求和
    P1423 小玉在游泳
    P1888 三角函数
    3295 落单的数 九章算法面试题
  • 原文地址:https://www.cnblogs.com/sunfuyou/p/7792629.html
Copyright © 2020-2023  润新知