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框架--实战地月系统围绕太阳旋转的更多相关文章

  1. iOS开发之SceneKit框架--加载多个模型.dae/.scn文件

    1.通过SCNGeometry或子类SCNParametricGeometry创建 相关链接:iOS开发之SceneKit框架--SCNGeometry.h iOS开发之SceneKit框架--SCN ...

  2. iOS开发之SceneKit框架--SCNNode.h

    1.SCNNode简介 SCNNode是场景图的结构元素,表示3D坐标空间中的位置和变换,您可以将模型,灯光,相机或其他可显示内容附加到该元素.也可以对其做动画. 2.相关API简介 初始化方法 // ...

  3. iOS开发之SceneKit框架--SCNAction.h

    1.SCNAction简介 主要负责节点SCNNode的属性,实现node的渐变.移动.出现.消失.实现动画等. 2.相关API 节点的移动(earthNode的初始坐标(5,0,0)) //从当前位 ...

  4. iOS开发之SceneKit框架--SCNLight.h

    1.SCNLight简介 用于添加光源,连接到一个节点照亮现场,可以给场景添加不同的灯光,模拟逼真的环境. 2.四种灯光的简介 添加一个box立方体.一个tube圆柱管道和一个地板floor,没有灯光 ...

  5. iOS开发之SceneKit框架--SCNCamera.h

    1.SCNCamera简介 被称为照相机或者摄像机,可以附加到节点以提供显示场景的角度.其实就是用户视角和人的眼睛一样. 2.相关API简介 初始化 //懒加载 + (instancetype)cam ...

  6. iOS开发之SceneKit框架--SCNGeometry.h

    1.SCNGeometry简介 SCNGeometry负责呈现三维模型的类,它管理者物体的形状.纹理等.它可以由SCNGeometrySource和SCNGeometryElement来构造, 一个S ...

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

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

  8. iOS开发之SceneKit框架--SCNParametricGeometry.h

    1.SCNParametricGeometry简介 SCNParametricGeometry用于创建简单的3D模型,比如SCNPlane 平面.SCNPyramid 锥形(金字塔).SCNBox 立 ...

  9. iOS开发之SceneKit框架--SCNScene.h

    1.SCNScene SCNScene是一个场景图——具有附加几何形状.光照.摄像机和其他属性的节点的层次结构,共同形成可显示的3D场景. 2.相关API简介 初始化方法 //懒加载 + (insta ...

随机推荐

  1. python编程语言学习day05(1)

    模块(不起与python相关模块的名字) 1.random random.random()    在0与1之间取随机数 random.randint(a,b)  在a,b之间取随机整数,包括边界 ra ...

  2. leetcood学习笔记-437-路径总和③**

    题目描述: 方法一:栈 class Solution(object): def pathSum(self, root, sum): """ :type root: Tre ...

  3. leetcood学习笔记-167-两数之和 II - 输入有序数组

    题目描述: 第一次提交: class Solution(object): def twoSum(self, numbers, target): """ :type num ...

  4. 【Codeforces 1148B】Born This Way

    [链接] 我是链接,点我呀:) [题意] 有人要从A地飞向B地,然后从B地飞向C地. 给出A,B地的n.m个航班的出发时间. 已知从A到B的航班都是ta和tb时长到达B.C 只有到达B的时候航班还没起 ...

  5. 25 面向对象设计实例——基于PCL点云库的通用工具开发

    0 引言 问题背景:pcl中提供了大量工具,用于对点云和三角面片文件进行处理和显示.在研究中,存在很多简易的需求,比如点云坐标转换,点云的打开显示以及同步显示,点云的最小包络求解,点云的格式转换等等. ...

  6. hive中的lateral view 与 explode函数的使用

    hive中的lateral view 与 explode函数的使用 背景介绍: explode与lateral view在关系型数据库中本身是不该出现的. 因为他的出现本身就是在操作不满足第一范式的数 ...

  7. 在fedora下面安装ftp服务器

    Fedora版本:Fedora 12 1. 安装vsftp #yum install vsftpd 一路yes,最后提示安装成功. 2. 配置vsftpd.conf. #vi /etc/vsftpd/ ...

  8. Matlab中的lambda表达式 f=@(x) x^2-2*x+1;

    Matlab中的lambda表达式 f=@(x) x^-*x+;

  9. ECMAScript1.3 数组 | 函数 | 作用域 | 预解析

    数组array 数组可以存储很多项,有顺序,很多项形成一个集合,就是数组. 数组字面量是:[] 如何获取数组中的数据:索引/下标,数组中的第一项的索引是从0开始的. ['kay', 'andy', 1 ...

  10. IK的整个分词处理过程

    首先,介绍一下IK的整个分词处理过程: 1. Lucene的分词基类是Analyzer,所以IK提供了Analyzer的一个实现类IKAnalyzer.首先,我们要实例化一个IKAnalyzer,它有 ...