3D 在iOS APP 上展示

2019-01-18  本文已影响20人  Q14
对于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 具有特点

OpenGL ES 介绍

OpenGL是用于2D/3D图形编程的一套基于C语言的统一接口,在桌面windows,Mac,Linux/Unix上均可兼容。
OpenGL ES是在OpenGL嵌入式设备上面的版本,也就是安卓/iPhone,其他嵌入式等移动设备的编程规范。(除此之外,在web上也有相应的WebGL)
OpenGL ES应用开发实践指南 iOS卷

SceneKit

相对简单又提供了大量的API接口,基本上能够满足大部分需求 是本次介绍的重点

再介绍一下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(世界坐标系).

camera

摄像机的显示范围控制,小于zNear不显示,大于zFar不显示.添加到一个空节点的camera属性里


image.png
SCNView内置属性
  1. 显示统计数据
    scnView.showsStatistics = true
  2. 打开相机控制
    scnView.allowsCameraControl = true
  3. 自动启用默认光源
    scnView.autoenablesDefaultLighting = true
  4. allowsCameraControl允许使用简单手势控制相机
  1. autoenablesDefaultLighting创建一个通用的全方向光源;
    fps:帧率,每秒渲染的画面数
      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
上一篇 下一篇

猜你喜欢

热点阅读