博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发之SceneKit框架--实战地月系统围绕太阳旋转
阅读量:6578 次
发布时间:2019-06-24

本文共 3415 字,大约阅读时间需要 11 分钟。

  

 

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

你可能感兴趣的文章
安卓开启多个服务
查看>>
设置分录行按钮监听事件
查看>>
C Primer Plus 第5章 运算符、表达式和语句 5.2基本运算符
查看>>
蓝牙手柄按键码
查看>>
redis启动失败
查看>>
java并发库之Executors常用的创建ExecutorService的几个方法说明
查看>>
Spring框架错误之org.springframework.beans.factory.BeanCreationException
查看>>
23种设计模式(1):单例模式
查看>>
socket 编程入门教程(五)UDP原理:4、“有连接”的UDP
查看>>
linux sort 命令详解
查看>>
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
Linux系统与网络服务管理技术大全(第2版)
查看>>
BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划
查看>>
Craking the Interview-1
查看>>
POJ 3468 A Simple Problem with Integers(线段树,区间更新,区间求和)
查看>>
CCF NOI1150 确定进制
查看>>
SpringBoot实战总汇--详解
查看>>