美文网首页
SCeneKit 学习(0)

SCeneKit 学习(0)

作者: acon | 来源:发表于2018-09-05 12:36 被阅读49次

    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. 创建工程


      a0cdc6b1-b1c9-4fd3-a5a4-51d7f7fb2b00.jpg
    2. build phases 中添加scene kit framework.

    3. 到ViewController 中 导入

    #import <SceneKit/SceneKit.h>
    
    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. 效果


      dedc82fe-b328-4eab-bdd4-c91cc7db72d9.png

    相关文章

      网友评论

          本文标题:SCeneKit 学习(0)

          本文链接:https://www.haomeiwen.com/subject/ylkawftx.html