最近到处搜集资料研究3D最后还是决定锁定OC框架,找到的学习资料随后慢慢整理

SceneKit 是一个OC 框架,开始之前,先熟悉一下SceneKit 的三维坐标系:

很清楚的看到,SceneKit 中的坐标系是右手坐标系(笛卡尔坐标系),如果需要与其他3D框架共享数据,先了解其框架是右手坐标系还是左手坐标系。其实也很好转化,就是Z 轴的正负不一样而已。

在开始开发之前,一定要了解下面这几个非常重要的类

SCNView &SCNSceneRenderer  
 
类似UIView,用来显示 SceneKit 的内容,定义了一些代理方法,可以用 addSubView 方法添加到UiView 中
 
SCNScene 
 
SceneKit 内容的容器. 你可以从3D建模工具生成的.dae文件中加载一个场景,或者用代码创建一个 ,然后把它显示在视图上
 
SCNNode    
一个场景的基本构建块,你可以把摄像机,灯光,几何体附加到节点上
 
SCNGeometry
 
一个可以连接到一个节点的三维物体。一个几何体(有时称为模型或网格)只定义了一个可见物体的形状。要定义对象的表面颜色图案,你必需要给几何体要附加材料。
然后给材料贴图,或者上色,这个几何体表面才会有颜色,或者图案。
SCNView &SCNSceneRenderer  
 
 类似UIView,用来显示 SceneKit 的内容,定义了一些代理方法,可以用 addSubView 方法添加到UiView 中
 
SCNScene 
 
SceneKit 内容的容器. 你可以从3D建模工具生成的.dae文件中加载一个场景,或者用代码创建一个 ,然后把它显示在视图上
 
SCNNode    
一个场景的基本构建块,你可以把摄像机,灯光,几何体附加到节点上
SCNGeometry
 
一个可以连接到一个节点的三维物体。一个几何体(有时称为模型或网格)只定义了一个可见物体的形状。要定义对象的表面颜色图案,你必需要给几何体要附加材料。
然后给材料贴图,或者上色,这个几何体表面才会有颜色,或者图案。
 
你可以从3D建模工具生成的.dae文件中加载一个几何体,也可以用代码创建,SceneKit 提供了几种常见几何体,是SCNGeometry 的子类,比如长方体,球,圆柱球等等,后面我们会写一个demo会把官方提供的几何体给大家列出来,给大家一个直观的感受。 当然我们也可以用三维坐标,法向量自定义几何体,也可以讲一个2D 图案转化成一个具有深度(厚度)的三维几何体。后面应该专门有一篇会讲到利用贝塞尔曲线将一个2D 图案转化成一个具有深度(厚度)的三维几何体。
 
SCNMaterial
 
材质,由于在3D建模工具中呈现球形,所以也叫材质球。上色,贴图全靠它。 SCNLight 光源可以附加到节点上,在渲染场景中提供着色  
SCNCamera 虚拟摄像机可以附加到节点上,提供了一个场景的视图。

了解以上知识,那我们就来动手开发吧,我们可以在Xcode   中新建一个SceneKit 项目:

运行效果如下:

这个新建的SceneKit 项目 里面会有一些示例代码,我们接下来挑一些重要的注释一下:

  1. SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];

从 SCN 文件中加载一个场景,也可以从.dae 文件中加载

  1. SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];

获得这个场景中飞机这个节点

  1. [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];

让飞机一直绕着他的Y  轴旋转

  1. scnView.allowsCameraControl = YES;

让用户可以控制摄像机,配合下面一句添加手势的代码,用户可以放大,缩小 ,360 度旋转整个场景

  1. gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];
  1. scnView.showsStatistics = YES;      控制下方的统计栏是否显示

单击手势中:

  1. // check what nodes are tapped
  2. CGPoint p = [gestureRecognize locationInView:scnView];
  3. NSArray *hitResults = [scnView hitTest:p options:nil];

类似射线检测,检测二维这个点向深无限延深,这个射线上的节点,返回一个数组,可用于单击选中,数组中第一个数据一般就是我们需要的节点。

  1. [SCNTransaction begin];
  2. [SCNTransaction setAnimationDuration:0.5];
  3. // on completion - unhighlight
  4. [SCNTransaction setCompletionBlock:^{
  5. [SCNTransaction begin];
  6. [SCNTransaction setAnimationDuration:0.5];
  7. material.emission.contents = [UIColor blackColor];
  8. [SCNTransaction commit];
  9. }];
  10. material.emission.contents = [UIColor redColor];
  11. [SCNTransaction commit];

SceneKit 中的动画区块,类似 UIKit  中的动画区块。

最新文章

  1. HTML DOM 对象
  2. oracle日常——sqlplus客户端登录
  3. html5 form表单常用标签
  4. R语言读写中文编码方式
  5. JavaBean的作用域
  6. 网页嵌入swf代码
  7. Windows环境下 PHP+Apache+Mysql配置
  8. JavaScript事件基础知识总结【思维导图】
  9. vim字符编码设置
  10. 注解SpringMVC
  11. 【Android Developers Training】 92. 序言:使用同步适配器传输数据
  12. NOIP[2015] Day2题解
  13. 为什么Unix只允许对非目录文件实行勾链?
  14. 深入理解Linux内核 学习笔记(4)
  15. Redis和Memcache区别,优缺点对比
  16. 本地调用QQ只需要一句代码
  17. 【第四篇】SAP ABAP7.5x新语法之CREATE DATA&INTERFACE
  18. java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
  19. Python中的对象行为与特殊方法(二)类型检查与抽象基类
  20. [Unity插件]Lua行为树(十二):行为树管理

热门文章

  1. 在调用self对象时,本类调用用Win32Info().collect()
  2. kinova roslaunch j2s7s300_moveit_config j2s7s300_demo.launc logs1
  3. Linux下手动查杀木马
  4. [转]Ubuntu 上创建常用磁盘阵列
  5. html的输出&,空格,大小于号
  6. 【Leetcode_easy】1046. Last Stone Weight
  7. 【ARTS】01_46_左耳听风-201900923~201900929
  8. 批处理&提权命令
  9. 龙六网络科技有限公司(Dragon six Network Technology Co., Ltd.)
  10. 使用redis调用lua脚本的方式对接口进行限流