iOS - SceneKit 3D引擎初探
最近到处搜集资料研究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 项目 里面会有一些示例代码,我们接下来挑一些重要的注释一下:
- SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];
从 SCN 文件中加载一个场景,也可以从.dae 文件中加载
- SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];
获得这个场景中飞机这个节点
- [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];
让飞机一直绕着他的Y 轴旋转
- scnView.allowsCameraControl = YES;
让用户可以控制摄像机,配合下面一句添加手势的代码,用户可以放大,缩小 ,360 度旋转整个场景
- gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];
- scnView.showsStatistics = YES; 控制下方的统计栏是否显示
单击手势中:
- // check what nodes are tapped
- CGPoint p = [gestureRecognize locationInView:scnView];
- NSArray *hitResults = [scnView hitTest:p options:nil];
类似射线检测,检测二维这个点向深无限延深,这个射线上的节点,返回一个数组,可用于单击选中,数组中第一个数据一般就是我们需要的节点。
- [SCNTransaction begin];
- [SCNTransaction setAnimationDuration:0.5];
- // on completion - unhighlight
- [SCNTransaction setCompletionBlock:^{
- [SCNTransaction begin];
- [SCNTransaction setAnimationDuration:0.5];
- material.emission.contents = [UIColor blackColor];
- [SCNTransaction commit];
- }];
- material.emission.contents = [UIColor redColor];
- [SCNTransaction commit];
SceneKit 中的动画区块,类似 UIKit 中的动画区块。
iOS - SceneKit 3D引擎初探的更多相关文章
- iOS cocos2d游戏引擎的了解之一
ios游戏引擎之Cocos2d(一) cocos2d是一个免费开源的ios游戏开发引擎,并且完全采用object-c进行编写,这对于已经用惯object-c进行ios应用开发的童鞋来说非常容易上手.这 ...
- 从0开发3D引擎(一):开篇
介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.最小功能集合(MVP)" 的3D引擎. 本系列的素材来自我们的产品 ...
- 从0开发3D引擎(二):准备预备知识
大家好,本文介绍了开发3D引擎需要的预备知识,给出了相关的资源. 上一篇博文 从0开发3D引擎(一):开篇 了解Web 3D Web 3D的历史 目前Web 3D是基于WebGL这个Web端3D AP ...
- iOS开发之UISearchBar初探
iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...
- 关于如何学好游戏3D引擎编程的一些经验[转]
此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰 ——阿哲VS自己 QQ79134054多希望大家一起交流与沟通 这篇文章是 ...
- 万圣节福利:红孩儿3D引擎开发课程《3ds max导出插件初步》
ds max文件夹,插件文件夹以及3ds max的可执行程序文件夹: 位的,这里要改成x64,否则启动程序后3ds max会提示"不是有效的win32程序"之类的对话框. 然后要将 ...
- 来手撸一个小小小小小"3D引擎"
开始的唠叨 说是3D引擎确实有点过于博眼球了,其实就是实现了一个透视投影,当然也不是那么简单的. 此篇文章是纯粹给小白看的 高手请勿喷 .也称之为小向带你图形学入门基础 . 哇哈哈哈哈 一说到做一个3 ...
- Flash Alternativa 3D引擎-基础理论
自由行走的花 网站设计,flash网站设计与动画制作,web,as3 2010-12-31 14:29 [转]Flash Alternativa 3D引擎-基础理论 <本文转载自:http:// ...
- 如何学好游戏3D引擎编程
注:本文是网上看到的一篇文章,感觉写的很好,因此收藏了下来 <如何学好游戏3D引擎编程>此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才 ...
随机推荐
- realsense SDK编译 release
1>------ 已启动生成: 项目: ZERO_CHECK, 配置: Release x64 ------1> Checking Build System1> CMake does ...
- 转 mysql 存储过程初探
https://www.cnblogs.com/qmfsun/p/4838032.htmlMySQL命令执行sql文件的两种方法 https://www.cnblogs.com/mark-chan/p ...
- 报错:Configured broker.id 68 doesn't match stored broker.id 113 in meta.properties
报错背景: CDH中安装完成kafka的组件后不能成功启动,发现UI界面中的broker.id和服务器中的broker.id不一致, 因此更改了服务器中broker.id 但是更改完成之后还是报错. ...
- 如何让winrar5压缩的文件能用低版本winrar打开
https://jingyan.baidu.com/article/39810a2348ab24b636fda681.html 在压缩文件格式选项处点选[RAR4]选项,即之前版本的winrar支持的 ...
- Swift4.0复习访问控制与作用域
1.访问等级: open: 可以继承,可以重写. public: “public 访问等级能用于修饰所有文件作用域的函数.对象.协议.枚举.结构体.类以及各种类型中的属性与方法.用 public 所修 ...
- Okhttp3基本使用
https://square.github.io/okhttp/ https://www.jianshu.com/p/da4a806e599b https://www.cnblogs.com/wzk- ...
- web端调起Windows系统应用程序(exe执行文件),全面兼容所有浏览器
1. 首先,你要有一个exe可执行文件2. 创建注册表创建注册表有两种方式(以“MyApp.exe”为例): 方式一:可视化编辑Win+R 打开运行,输入 regedit 并回车,进入注册表编辑器新建 ...
- 常见问题:MySQL/排序
MySQL的排序分为两种,通过排序操作和按索引扫描排序. 按索引顺序扫描是一种很高效的方式,但使用的条件较为严格,只有orderby语句使用索引最左前列,或where语句与orderby语句条件列组合 ...
- mysql left join 右表数据不唯一的情况解决方法
mysql left join 右表数据不唯一的情况解决方法 <pre>member 表id username1 fdipzone2 terry member_login_log 表id ...
- 数据库的ACID和CAP
传统数据库的ACID分别是: A(Atomicty)原子性 B(Consistency)一致性 I(Isolation)独立性 D(Du ...