SCeneKit 学习(0)

SceneKit 简介
参考文章:https://techblog.toutiao.com/2017/07/05/session604/

  1. 背景
    SceneKit是苹果 2012 年引入的一个处理 3D 场景的高层框架,底层技术从开始的OpenGL,迁移到后来的Metal。一开始只支持 macOS 平台,在 2014 年的开发者大会上正式通过 iOS 8 引入移动平台,后来随着 watchOS 和 tvOS 的陆续问世,SceneKit 成为了一项全平台 3D 图形处理及场景渲染技术。

SceneKit 框架位于底层图形库和CocoaTouch之间,与CoreAnimation,CoreImage等位于同一层。它对图形渲染等底层技术做了高层的接口封装,并抽象出几个核心概念。场景图、镜头、光源、几何体、物质、物理系统等 3D 场景中的真实概念,都被抽象成独立的对象并提供了可读性良好的状态获取和设置方法,开发者只需与这些概念打交道就能实现设计稿中的 3D 场景。

  1. SceneKit 简介

首先介绍下 SceneKit 框架中的几个核心概念:

SCNView: 3D 画布

SCNScene: 3D 场景图

SCNNode: 结点

SCNCamera: 镜头

SCNLight: 光源

SCNGeometry: 几何形状

SCNMaterial: 物质

SCNAction: 行为动画

SCNPhysicsWorld: 物理世界对象

粒子系统

SCNPhysicsBehavior:物理行为

SCNConstraint:约束

SCNKinner: 骨骼动画

CIFilter: 滤镜

SCNAnimationEvent: 动画播放过程中的特定时间执行闭包的容器

物体碰撞

上述属性 会 单独成一块拉出来进行讲解.

  1. SceneKit 3D 场景的处理通常出现在游戏开发中,我们在 App 开发中比较少用到。想要在 iOS 中展现一个 3D 场景,还可以基于以下技术实现:

OpenGL ES , Unity 3D. OpenGL 是比较底层的图形程序接口集,ES是其三维图形子集,需要对图形学、图像处理技术等专业知识有一定了解,学习门槛较高。而Unity 3D是专门的游戏开发引擎,虽然功能强大但针对简单的 3D 场景,显得过于复杂且上手比较慢。

SceneKit 框架位于底层图形库和CocoaTouch之间,与CoreAnimation,CoreImage等位于同一层。它对图形渲染等底层技术做了高层的接口封装,并抽象出几个核心概念。场景图、镜头、光源、几何体、物质、物理系统等 3D 场景中的真实概念,都被抽象成独立的对象并提供了可读性良好的状态获取和设置方法,开发者只需与这些概念打交道就能实现设计稿中的 3D 场景。

  1. 介绍SCNView,SCNScene,SCNNode,SCNCamera 的使用.

SCNView 介绍: SCNView 主要负责显示3D 模型对象视图,继承自UIView,能够直接添加到UIView 上.

SCNView 功能:

  1. 设置游戏运行时的帧率

  2. 截屏

  3. 开始暂停游戏

  4. 抗锯齿

  5. 控制摄像机

  6. 显示统计菜单

  7. 执行渲染方式(OpenGL/Metal([https://baike.baidu.com/item/Metal/10917053?fr=aladdin)](https://baike.baidu.com/item/Metal/10917053?fr=aladdin%29%29)

SCNView 实例详解:

  1. 创建工程


    SCeneKit 学习(0)_第1张图片
    a0cdc6b1-b1c9-4fd3-a5a4-51d7f7fb2b00.jpg
  2. build phases 中添加scene kit framework.

  3. 到ViewController 中 导入

#import 
  1. 代码:
- (void)viewDidLoad {
[super viewDidLoad];
//1. 创建View
SCNView *scnView = [[SCNView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:scnView];
//2. 创建场景
SCNScene *scene = [SCNScene scene];
scnView.scene = scene;
//3. 创建盒子模型
SCNBox *box = [SCNBox boxWithWidth:.5 height:.5 length:.5 chamferRadius:0];
box.firstMaterial.diffuse.contents = @"earth.jpg";//[UIColor greenColor];
//盒子模型节点
SCNNode *node = [SCNNode nodeWithGeometry:box];
//场景中添加盒子模型节点
[scene.rootNode addChildNode:node];
// 运行操作运动摄像机
scnView.allowsCameraControl = YES;
// 抗锯齿(会比较消耗系统性能)
scnView.antialiasingMode = SCNAntialiasingModeMultisampling4X;
// 添加一个相机节点
SCNNode *cameraNode = [SCNNode node];
SCNCamera *camera = [SCNCamera camera];
cameraNode.camera = camera;
cameraNode.position = SCNVector3Make(0, 0, 3);
[scene.rootNode addChildNode:cameraNode];
}
  1. 游戏截屏:
// 游戏截屏
UIImage *snapView = [scnView snapshot];
// 设置游戏帧率
scnView.preferredFramesPerSecond = 30;
// 打开统计菜单
scnView.showsStatistics = YES;
  1. 效果


    SCeneKit 学习(0)_第2张图片
    dedc82fe-b328-4eab-bdd4-c91cc7db72d9.png

你可能感兴趣的:(SCeneKit 学习(0))