对于iOS开发者来说,想进行3D内容视觉展示开发工具有Metal、OpenGL ES 、SceneKit, Untiy3D
Untiy3D 介绍
不作为本次分享重点 原因:1. 集成很麻烦 2. 集成到项目中有点重
如果想要了解 Untiy3D 请参考如下链接
Metal 介绍
Metal 是一个和 OpenGL ES 类似的面向底层的图形编程接口,通过使用相关的 api 可以直接操作 GPU ,最早在 2014 年的 WWDC
Metal 是 iOS 平台独有的,意味着它不能像 OpenGL ES 那样支持跨平台,但是它能最大的挖掘苹果移动设备的 GPU 能力,进行复杂的运算,像 Unity 等游戏引擎都通过 Metal 对 3D 能力进行了优化, App Store 还有相应的运用 Metal 技术的游戏专题。
Metal 具有特点
- GPU 支持的 3D 渲染
- 和 CPU 并行处理数据 (深度学习)
- 提供低功耗接口
- 可以和 CPU 共享资源内存
OpenGL ES 介绍
OpenGL是用于2D/3D图形编程的一套基于C语言的统一接口,在桌面windows,Mac,Linux/Unix上均可兼容。
OpenGL ES是在OpenGL嵌入式设备上面的版本,也就是安卓/iPhone,其他嵌入式等移动设备的编程规范。(除此之外,在web上也有相应的WebGL)
OpenGL ES应用开发实践指南 iOS卷
SceneKit
相对简单又提供了大量的API接口,基本上能够满足大部分需求 是本次介绍的重点
- sceneKit 从WWWDC2012 至今,苹果也陆续对该框架进行的升级,使其功能变得强大,不仅支持常见的节点约束,粒子动画,骨骼动画等强大特性
因其API 相对完善 使用简单 强力推荐 -
SceneKit使用的是右手坐标系,默认视图的方向是沿负Z轴方向的。可以简单的记住红色为x轴,绿色为y轴,蓝色为z轴
再介绍一下SceneKit 展示相关API
SCNView
SCNView是显示3D模型对象的视图,继承自UIView。 可以理解为画布
SCNSCene
SCNSCene 自带一个定义了坐标系的root node(根节点),使用scene gragh来组织场景,可以向内部增加树状结构的内部节点(node),例如 lights光源, cameras相机, geometry几何体, particle emitters粒子发射源. 需要放到SCNView的实例中呈现
SCNNode
游戏中的每个元素都被称为node(节点),存放在树状结构scene gragh中,例如 lights光源, cameras相机, geometry几何体, particle emitters粒子发射源.每个scene graph中包含一个特殊的基础节点:root node(根节点),可以把其他节点添加到节点下面,变成它的子节点.
添加到scene中的node,默认在(x:0, y:0, z:0),即相对于父节点的位置.要想调整节点在父节点的位置,应该调整local coordinates(本地坐标系),而不是调整world coordinates(世界坐标系).
- 注意 默认情况下,如果一个场景中没有任何改变时,Scene Kit会进入"paused"(暂停)状态,为了防止这种情况,需要在创建SCNView实例时设置playing属性为true如
camera
摄像机的显示范围控制,小于zNear不显示,大于zFar不显示.添加到一个空节点的camera属性里
SCNView内置属性
- 显示统计数据
scnView.showsStatistics = true
- 打开相机控制
scnView.allowsCameraControl = true
- 自动启用默认光源
scnView.autoenablesDefaultLighting = true
- allowsCameraControl允许使用简单手势控制相机
- 单指滑动:旋转相机;
- 双指滑动:移动相机;
- 双指捏合:缩放;
- 双击:如果有两个相机则切换,一个相机则返回原始状态;
- autoenablesDefaultLighting创建一个通用的全方向光源;
fps:帧率,每秒渲染的画面数
- :每帧画面渲染的总物体数,多光源照射同一物体时会渲染多次
- :每帧画面渲染的多边形总数量
下面贴一下SCNView展示OBJ的代码
let frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
//SCNView是显示3D模型对象的视图,继承自UIView
let scncesView = SCNView(frame: frame)
scncesView.allowsCameraControl = true
scncesView.showsStatistics = true
// scncesView.autoenablesDefaultLighting = true
scncesView.backgroundColor = UIColor.black
self.view.addSubview(scncesView)
//从 art.scnassets 加载OBJ
let dir = "art.scnassets/capture/5f09505ae2134eac8b4dee35fd024550"
let scnce = SCNScene(named: dir + "/custom.obj")
let node = scnce?.rootNode.childNodes.first
node?.geometry?.firstMaterial?.lightingModel = .blinn
node?.geometry?.firstMaterial?.diffuse.contents = dir + "/custom.jpg"
scncesView.scene = scnce