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

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: y: z: duration:]]];
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: y: z: duration:]]];
- 同样地月系统也新建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: y: z: duration:]]];
[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(, , ); 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: y: z: duration:]]];
[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: y: z: duration:]]]; //新建地月系统和设置旋转
self.earthGroupNode = [SCNNode node];
self.earthGroupNode.position = self.sunNode.position;
[self.earthGroupNode addChildNode:self.earthNode];
[self.earthGroupNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]];
[self.sunNode addChildNode:self.earthGroupNode]; //获取月球node和设置自转
self.moonNode = [scene.rootNode childNodeWithName:@"moon" recursively:YES];
[self.moonNode runAction:[SCNAction repeatActionForever:[SCNAction rotateByX: y: z: duration:]]]; //新建月球公转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: y: z: duration:]]];
}
iOS开发之SceneKit框架--实战地月系统围绕太阳旋转的更多相关文章
- iOS开发之SceneKit框架--加载多个模型.dae/.scn文件
1.通过SCNGeometry或子类SCNParametricGeometry创建 相关链接:iOS开发之SceneKit框架--SCNGeometry.h iOS开发之SceneKit框架--SCN ...
- iOS开发之SceneKit框架--SCNNode.h
1.SCNNode简介 SCNNode是场景图的结构元素,表示3D坐标空间中的位置和变换,您可以将模型,灯光,相机或其他可显示内容附加到该元素.也可以对其做动画. 2.相关API简介 初始化方法 // ...
- iOS开发之SceneKit框架--SCNAction.h
1.SCNAction简介 主要负责节点SCNNode的属性,实现node的渐变.移动.出现.消失.实现动画等. 2.相关API 节点的移动(earthNode的初始坐标(5,0,0)) //从当前位 ...
- iOS开发之SceneKit框架--SCNLight.h
1.SCNLight简介 用于添加光源,连接到一个节点照亮现场,可以给场景添加不同的灯光,模拟逼真的环境. 2.四种灯光的简介 添加一个box立方体.一个tube圆柱管道和一个地板floor,没有灯光 ...
- iOS开发之SceneKit框架--SCNCamera.h
1.SCNCamera简介 被称为照相机或者摄像机,可以附加到节点以提供显示场景的角度.其实就是用户视角和人的眼睛一样. 2.相关API简介 初始化 //懒加载 + (instancetype)cam ...
- iOS开发之SceneKit框架--SCNGeometry.h
1.SCNGeometry简介 SCNGeometry负责呈现三维模型的类,它管理者物体的形状.纹理等.它可以由SCNGeometrySource和SCNGeometryElement来构造, 一个S ...
- iOS开发之SceneKit框架--SCNView.h
1.SCNView 在macOS中,SCNView是NSView的子类,在iOS和tvOS中,SCNView是UIView的子类.SCNView用于显示SceneKit的3D场景,而需要设置场景的相关 ...
- iOS开发之SceneKit框架--SCNParametricGeometry.h
1.SCNParametricGeometry简介 SCNParametricGeometry用于创建简单的3D模型,比如SCNPlane 平面.SCNPyramid 锥形(金字塔).SCNBox 立 ...
- iOS开发之SceneKit框架--SCNScene.h
1.SCNScene SCNScene是一个场景图——具有附加几何形状.光照.摄像机和其他属性的节点的层次结构,共同形成可显示的3D场景. 2.相关API简介 初始化方法 //懒加载 + (insta ...
随机推荐
- python编程语言学习day05(1)
模块(不起与python相关模块的名字) 1.random random.random() 在0与1之间取随机数 random.randint(a,b) 在a,b之间取随机整数,包括边界 ra ...
- leetcood学习笔记-437-路径总和③**
题目描述: 方法一:栈 class Solution(object): def pathSum(self, root, sum): """ :type root: Tre ...
- leetcood学习笔记-167-两数之和 II - 输入有序数组
题目描述: 第一次提交: class Solution(object): def twoSum(self, numbers, target): """ :type num ...
- 【Codeforces 1148B】Born This Way
[链接] 我是链接,点我呀:) [题意] 有人要从A地飞向B地,然后从B地飞向C地. 给出A,B地的n.m个航班的出发时间. 已知从A到B的航班都是ta和tb时长到达B.C 只有到达B的时候航班还没起 ...
- 25 面向对象设计实例——基于PCL点云库的通用工具开发
0 引言 问题背景:pcl中提供了大量工具,用于对点云和三角面片文件进行处理和显示.在研究中,存在很多简易的需求,比如点云坐标转换,点云的打开显示以及同步显示,点云的最小包络求解,点云的格式转换等等. ...
- hive中的lateral view 与 explode函数的使用
hive中的lateral view 与 explode函数的使用 背景介绍: explode与lateral view在关系型数据库中本身是不该出现的. 因为他的出现本身就是在操作不满足第一范式的数 ...
- 在fedora下面安装ftp服务器
Fedora版本:Fedora 12 1. 安装vsftp #yum install vsftpd 一路yes,最后提示安装成功. 2. 配置vsftpd.conf. #vi /etc/vsftpd/ ...
- Matlab中的lambda表达式 f=@(x) x^2-2*x+1;
Matlab中的lambda表达式 f=@(x) x^-*x+;
- ECMAScript1.3 数组 | 函数 | 作用域 | 预解析
数组array 数组可以存储很多项,有顺序,很多项形成一个集合,就是数组. 数组字面量是:[] 如何获取数组中的数据:索引/下标,数组中的第一项的索引是从0开始的. ['kay', 'andy', 1 ...
- IK的整个分词处理过程
首先,介绍一下IK的整个分词处理过程: 1. Lucene的分词基类是Analyzer,所以IK提供了Analyzer的一个实现类IKAnalyzer.首先,我们要实例化一个IKAnalyzer,它有 ...