SCeneKit 学习(0)
SceneKit 简介
参考文章:https://techblog.toutiao.com/2017/07/05/session604/
- 背景
SceneKit是苹果 2012 年引入的一个处理 3D 场景的高层框架,底层技术从开始的OpenGL,迁移到后来的Metal。一开始只支持 macOS 平台,在 2014 年的开发者大会上正式通过 iOS 8 引入移动平台,后来随着 watchOS 和 tvOS 的陆续问世,SceneKit 成为了一项全平台 3D 图形处理及场景渲染技术。
SceneKit 框架位于底层图形库和CocoaTouch之间,与CoreAnimation,CoreImage等位于同一层。它对图形渲染等底层技术做了高层的接口封装,并抽象出几个核心概念。场景图、镜头、光源、几何体、物质、物理系统等 3D 场景中的真实概念,都被抽象成独立的对象并提供了可读性良好的状态获取和设置方法,开发者只需与这些概念打交道就能实现设计稿中的 3D 场景。
- SceneKit 简介
首先介绍下 SceneKit 框架中的几个核心概念:
SCNView: 3D 画布
SCNScene: 3D 场景图
SCNNode: 结点
SCNCamera: 镜头
SCNLight: 光源
SCNGeometry: 几何形状
SCNMaterial: 物质
SCNAction: 行为动画
SCNPhysicsWorld: 物理世界对象
粒子系统
SCNPhysicsBehavior:物理行为
SCNConstraint:约束
SCNKinner: 骨骼动画
CIFilter: 滤镜
SCNAnimationEvent: 动画播放过程中的特定时间执行闭包的容器
物体碰撞
上述属性 会 单独成一块拉出来进行讲解.
- SceneKit 3D 场景的处理通常出现在游戏开发中,我们在 App 开发中比较少用到。想要在 iOS 中展现一个 3D 场景,还可以基于以下技术实现:
OpenGL ES , Unity 3D. OpenGL 是比较底层的图形程序接口集,ES是其三维图形子集,需要对图形学、图像处理技术等专业知识有一定了解,学习门槛较高。而Unity 3D是专门的游戏开发引擎,虽然功能强大但针对简单的 3D 场景,显得过于复杂且上手比较慢。
SceneKit 框架位于底层图形库和CocoaTouch之间,与CoreAnimation,CoreImage等位于同一层。它对图形渲染等底层技术做了高层的接口封装,并抽象出几个核心概念。场景图、镜头、光源、几何体、物质、物理系统等 3D 场景中的真实概念,都被抽象成独立的对象并提供了可读性良好的状态获取和设置方法,开发者只需与这些概念打交道就能实现设计稿中的 3D 场景。
- 介绍SCNView,SCNScene,SCNNode,SCNCamera 的使用.
SCNView 介绍: SCNView 主要负责显示3D 模型对象视图,继承自UIView,能够直接添加到UIView 上.
SCNView 功能:
-
设置游戏运行时的帧率
-
截屏
-
开始暂停游戏
-
抗锯齿
-
控制摄像机
-
显示统计菜单
-
执行渲染方式(OpenGL/Metal([https://baike.baidu.com/item/Metal/10917053?fr=aladdin)](https://baike.baidu.com/item/Metal/10917053?fr=aladdin%29%29)
SCNView 实例详解:
-
创建工程
a0cdc6b1-b1c9-4fd3-a5a4-51d7f7fb2b00.jpg -
build phases 中添加scene kit framework.
-
到ViewController 中 导入
#import <SceneKit/SceneKit.h>
- 代码:
- (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];
}
- 游戏截屏:
// 游戏截屏
UIImage *snapView = [scnView snapshot];
// 设置游戏帧率
scnView.preferredFramesPerSecond = 30;
// 打开统计菜单
scnView.showsStatistics = YES;
-
效果
dedc82fe-b328-4eab-bdd4-c91cc7db72d9.png