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. CAS机制是什么?有什么缺点,会出现什么问题

    CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换. CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B. CAS的缺点: 1.CPU开销较大 在 ...

  2. 安装percona-toolkit.rpm时候报错:perl(Time::HiRes) is needed by percona-toolkit-2.2.16-1.noarch

    1.安装percona-toolkit.rpm时候报错: warning: percona-toolkit.rpm: Header V4 DSA/SHA1 Signature, key ID cd2e ...

  3. 扩展欧几里得原理的应用:POJ1061青蛙的约会

    /* POJ 1061: 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 123709 Accepted: 26395 ...

  4. J2SE基础-环境配置

    学习资料:毕向东视频 1.为何配置Path? 使用javac编译文件时,先找path里设置的java路径. 如果不配置Path,在命令提示行中,则只能进入bin目录后,才能执行javac,jar等命令 ...

  5. php数组函数,遍历数组的几种方法

    数组创建: 1.array(): 生成一个数组 $a=array("Dog","Cat","Horse"); print_r($a);数组值 ...

  6. [HL] 7.5 集训总结

    对于某唤做赛区难度的题,我只能是内流满面..拿到题,A神题不可做,B,神题不可做,C,神题不可做...最后yy了一个A的算法...只得了20 TAT.C题骗分似乎有50 ..B题本来想骗分..然后/ ...

  7. kafaka集群部署

    1.集群规划 kafka集群配置是依赖zookeeper的,所以需要保证先安装了zookeeper和jdk注意:kafka内自带zookeeper,我们不使用自带的. hadoop101 hadoop ...

  8. (转)简单的RPC java实现 .

    转:http://blog.csdn.net/jackliang55/article/details/7580563 我也承认,RPC的名声大噪之时是在2003年,那一个“冲击波”病毒(Blaster ...

  9. 基于Netty的RPC架构学习笔记(一):NIO

    文章目录 传统的socket分析 举个

  10. JVM内核-原理、诊断与优化学习笔记(四):GC算法与种类

    文章目录 GC的概念 GC算法 引用计数法 引用计数法的问题 标记清除 标记压缩 小问题 复制算法 复制算法的最大问题是:空间浪费 整合标记清理思想 -XX:+PrintGCDetails的输出 gc ...