3D 在iOS APP 上展示

对于iOS开发者来说,想进行3D内容视觉展示开发工具有Metal、OpenGL ES 、SceneKit, Untiy3D
Untiy3D 介绍

不作为本次分享重点 原因:1. 集成很麻烦 2. 集成到项目中有点重
如果想要了解 Untiy3D 请参考如下链接

  1. 下载链接

  2. 集成到项目中文档

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轴


    image.png
再介绍一下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属性里


image.png
SCNView内置属性
  1. 显示统计数据
    scnView.showsStatistics = true
  2. 打开相机控制
    scnView.allowsCameraControl = true
  3. 自动启用默认光源
    scnView.autoenablesDefaultLighting = true
  4. allowsCameraControl允许使用简单手势控制相机
  • 单指滑动:旋转相机;
  • 双指滑动:移动相机;
  • 双指捏合:缩放;
  • 双击:如果有两个相机则切换,一个相机则返回原始状态;
  1. 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

你可能感兴趣的:(3D 在iOS APP 上展示)