1、创建地月太阳系统scn文件

  注意:moon在earth结构下,earth和moon在sun结构下。

2、获取scn中模型的对应节点和自转(太阳为例)

  • 获取节点: name是对应的Identity字符串
    self.sunNode = [scene.rootNode childNodeWithName:@"sun" recursively:YES];

  • 自转:围绕Y轴旋转
    [self.sunNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:1 z:0 duration:1]]];

3、地月系统的公转和月亮公转

  • 月亮公转是围绕地球的中心转,但是旋转动画只会围绕自身的轴旋转,所以将moonNode添加到earthNode,这样月球的公转和地球自转一样;
  • 但是月亮公转不和地球自转一致,所以需要新建node节点,位置和地球node一样,将moomNode添加到新建的node上,新建node添加到地球node;
    //新建月球公转node和设置旋转self.moonRotationNode = [SCNNode node];self.moonRotationNode.position = self.sunNode.position;[self.moonRotationNode addChildNode: self.moonNode];[self.earthNode addChildNode:self.moonRotationNode];[self.moonRotationNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:3 z:0 duration:1]]];

  • 同样地月系统也新建node与太阳node位置相同,添加到太阳node上
    //新建地月系统和设置旋转self.earthGroupNode = [SCNNode node];self.earthGroupNode.position = self.sunNode.position;[self.earthGroupNode addChildNode:self.earthNode];[self.earthGroupNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:1 z:0 duration:1]]];[self.sunNode addChildNode:self.earthGroupNode];

4、父子node的关系

  • 每个node节点都拥有一个以自身为原点的坐标系

  注意:之前提到需要注意结构层次 正确的层次moon在earth下

  错误的层次 moon在sun下

  • 这个模型的节点树

  说明:moonNode应该在earthNode下,此时位置为(2,0,0)。如果是错误层次位置就是(12,0,0)。效果就像上面一样。

  • 对父node添加的动画也会作用于所有的子node

  说明:地球围绕太阳公转,但没有设置月球围绕太阳转的动画?

       但是月球在地球的层次下,地月系统都是太阳的子node,所有动画就作用于月球上。

5、相关代码

- (void)viewDidLoad
{[super viewDidLoad];SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/sun.scn"];SCNNode *cameraNode = [SCNNode node];cameraNode.camera = [SCNCamera camera];[scene.rootNode addChildNode:cameraNode];cameraNode.position = SCNVector3Make(0, 0, 45);self.sCNView= (SCNView *)self.view;self.sCNView.scene = scene;self.sCNView.allowsCameraControl = YES;self.sCNView.showsStatistics = YES;self.sCNView.autoenablesDefaultLighting = YES;self.sunNode = [scene.rootNode childNodeWithName:@"sun" recursively:YES];[self.sunNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:1 z:0 duration:1]]];[self.sCNView.scene.rootNode addChildNode:self.sunNode];self.lightNode = [scene.rootNode childNodeWithName:@"sunOmni" recursively:YES];self.earthNode = [scene.rootNode childNodeWithName:@"earth" recursively:YES];[self.earthNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];//新建地月系统和设置旋转self.earthGroupNode = [SCNNode node];self.earthGroupNode.position = self.sunNode.position;[self.earthGroupNode addChildNode:self.earthNode];[self.earthGroupNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:1 z:0 duration:1]]];[self.sunNode addChildNode:self.earthGroupNode];//获取月球node和设置自转self.moonNode = [scene.rootNode childNodeWithName:@"moon" recursively:YES];[self.moonNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:4 z:0 duration:1]]];//新建月球公转node和设置旋转self.moonRotationNode = [SCNNode node];self.moonRotationNode.position = self.sunNode.position;[self.moonRotationNode addChildNode: self.moonNode];[self.earthNode addChildNode:self.moonRotationNode];[self.moonRotationNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:3 z:0 duration:1]]];
}

转载于:https://www.cnblogs.com/xianfeng-zhang/p/9040639.html

iOS开发之SceneKit框架--实战地月系统围绕太阳旋转相关推荐

  1. iOS开发之SceneKit框架--SCNView.h

    1.SCNView 在macOS中,SCNView是NSView的子类,在iOS和tvOS中,SCNView是UIView的子类.SCNView用于显示SceneKit的3D场景,而需要设置场景的相关 ...

  2. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  3. iOS开发之Accounts框架详解

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之Accounts框架详解 Accounts框架是iOS原生提供的一套账户管理框架,其支持Facebook,新浪微博 ...

  4. (0068)iOS开发之AutoLayout框架Masonry使用心得

    苹果官方给出了一些有关自动布局的建议 不论用interfaceBuilder还是用代码来实现自动布局,这些建议都是适用的. (1)不用view的frame.bounds.center来指定view的形 ...

  5. iOS开发之Masonry框架-源码解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架.Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  6. iOS开发之Masonry框架源码解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  7. iOS开发之Masonry框架源码深度解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  8. iOS开发之ReplayKit框架学习

    ReplayKit简介 在iOS 9中,ReplayKit 是一款全新的框架,可谓是游戏开发者(开发商)的福音.它可以让玩家更便捷地记录游戏进度或数据以及分享的功能.除此之外更强大的是:ReplayK ...

  9. iOS开发之Masonry框架-使用方法须知

    目录 常用的属性与常量 Masonry使用注意 约束的优先级 Masonry添加约束的方法 修改约束 在哪创建我的约束 创建约束技巧: Masonry是一个轻量级的布局框架,它拥有自己的描述语法(采用 ...

最新文章

  1. 服务器虚拟化组网方案,服务器虚拟化部署方案计划.doc
  2. SLAM/检测跟踪/多传感器融合方向实习生招聘 | 腾讯Robotics X实验室
  3. Go的异常处理 defer, panic, recover
  4. Entity framework 意外删除了表,如何在不影响其它表的情况下恢复回来 (EF数据库迁移原理)...
  5. php 对接中国天气网 城市 id json串
  6. 域迁移(降级)注意事项
  7. Table Dragger - 简单的 JS 拖放排序表格插件
  8. Javascript中函数声明与函数表达式的不同
  9. python 中del 的用法
  10. 防止电子邮件地址被搜索到的新方法
  11. fatal error LINK1123:failure during conversion to COFF:file invalid or corrupt
  12. 为GitHub项目加入Travis-CI的自动集成
  13. 服务器怎么开启lldp协议,修改服务器lldp的mac地址
  14. html自动选择省市,jQuery中国省市区地址三级联动插件Distpicker
  15. 每分钟54万多条数据更新,商品系统性能如何优化?
  16. opend和open的区别_open 和 opened 的具体区别~~
  17. 优秀笔记课件——WORD使用技巧
  18. 计算机网络三:运输层
  19. Java线程中,Blocked,Wait,以及TIMED_WAIT的区别
  20. 诓”妹妹与“旺”夫君

热门文章

  1. Win7 连接局域网共享之后 提示错误代码:0x800704b3(实测可用)
  2. Linux系统中,各种小动物
  3. ブランド (brand) 品牌,商标
  4. 解决ajax异步请求数据后swiper不能循环轮播(loop失效)问题、滑动后不能轮播的问题。
  5. InsecureRequestWarning: Unverified HTTPS request is being made.解决方法
  6. php Access-Control-Allow-Origin 解决跨域问题
  7. 出现 Request Entity Too Large问题的解决方法
  8. 如何从数据框的单元格获取值?
  9. 为什么rand()+ rand()产生负数?
  10. 对服务与工厂感到困惑