• iOS


    最近到处搜集资料研究3D最后还是决定锁定OC框架,找到的学习资料随后慢慢整理

    SceneKit 是一个OC 框架,开始之前,先熟悉一下SceneKit 的三维坐标系:

    很清楚的看到,SceneKit 中的坐标系是右手坐标系(笛卡尔坐标系),如果需要与其他3D框架共享数据,先了解其框架是右手坐标系还是左手坐标系。其实也很好转化,就是Z 轴的正负不一样而已。

    在开始开发之前,一定要了解下面这几个非常重要的类

     

    SCNView &SCNSceneRenderer  

     

    类似UIView,用来显示 SceneKit 的内容,定义了一些代理方法,可以用 addSubView 方法添加到UiView

     

    SCNScene 

     

    SceneKit 内容的容器. 你可以从3D建模工具生成的.dae文件中加载一个场景,或者用代码创建一个 ,然后把它显示在视图上

     

    SCNNode    

    一个场景的基本构建块,你可以把摄像机,灯光,几何体附加到节点上

     

    SCNGeometry

     

    一个可以连接到一个节点的三维物体。一个几何体(有时称为模型或网格)只定义了一个可见物体的形状。要定义对象的表面颜色图案,你必需要给几何体要附加材料。

    然后给材料贴图,或者上色,这个几何体表面才会有颜色,或者图案。

    SCNView &SCNSceneRenderer  

     

     类似UIView,用来显示 SceneKit 的内容,定义了一些代理方法,可以用 addSubView 方法添加到UiView

     

    SCNScene 

     

    SceneKit 内容的容器. 你可以从3D建模工具生成的.dae文件中加载一个场景,或者用代码创建一个 ,然后把它显示在视图上

     

    SCNNode    

    一个场景的基本构建块,你可以把摄像机,灯光,几何体附加到节点上

    SCNGeometry

     

    一个可以连接到一个节点的三维物体。一个几何体(有时称为模型或网格)只定义了一个可见物体的形状。要定义对象的表面颜色图案,你必需要给几何体要附加材料。

    然后给材料贴图,或者上色,这个几何体表面才会有颜色,或者图案。

     

    你可以从3D建模工具生成的.dae文件中加载一个几何体,也可以用代码创建,SceneKit 提供了几种常见几何体,是SCNGeometry 的子类,比如长方体,球,圆柱球等等,后面我们会写一个demo会把官方提供的几何体给大家列出来,给大家一个直观的感受。 当然我们也可以用三维坐标,法向量自定义几何体,也可以讲一个2D 图案转化成一个具有深度(厚度)的三维几何体。后面应该专门有一篇会讲到利用贝塞尔曲线将一个2D 图案转化成一个具有深度(厚度)的三维几何体。

     

    SCNMaterial

     

    材质,由于在3D建模工具中呈现球形,所以也叫材质球。上色,贴图全靠它。


    SCNLight

    光源可以附加到节点上,在渲染场景中提供着色

     

    SCNCamera

    虚拟摄像机可以附加到节点上,提供了一个场景的视图。

     

     

    了解以上知识,那我们就来动手开发吧,我们可以在Xcode   中新建一个SceneKit 项目:

    运行效果如下:

    这个新建的SceneKit 项目 里面会有一些示例代码,我们接下来挑一些重要的注释一下:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];  


    从 SCN 文件中加载一个场景,也可以从.dae 文件中加载

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];  


    获得这个场景中飞机这个节点

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];  

    让飞机一直绕着他的Y  轴旋转

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. scnView.allowsCameraControl = YES;  


    让用户可以控制摄像机,配合下面一句添加手势的代码,用户可以放大,缩小 ,360 度旋转整个场景

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];  



    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. scnView.showsStatistics = YES;      控制下方的统计栏是否显示  




    单击手势中:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // check what nodes are tapped  
    2.     CGPoint p = [gestureRecognize locationInView:scnView];  
    3.     NSArray *hitResults = [scnView hitTest:p options:nil];  


        类似射线检测,检测二维这个点向深无限延深,这个射线上的节点,返回一个数组,可用于单击选中,数组中第一个数据一般就是我们需要的节点。

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. [SCNTransaction begin];  
    2.    [SCNTransaction setAnimationDuration:0.5];  
    3.      
    4.    // on completion - unhighlight  
    5.    [SCNTransaction setCompletionBlock:^{  
    6.        [SCNTransaction begin];  
    7.        [SCNTransaction setAnimationDuration:0.5];  
    8.          
    9.        material.emission.contents = [UIColor blackColor];  
    10.          
    11.        [SCNTransaction commit];  
    12.    }];  
    13.      
    14.    material.emission.contents = [UIColor redColor];  
    15.      
    16.    [SCNTransaction commit];  


    SceneKit 中的动画区块,类似 UIKit  中的动画区块。

     

  • 相关阅读:
    关于linux下如何使用svn 客户端
    vscode 如何格式化vue(template)html代码 , 保持标签属性不换行
    echarts的一些基础笔记
    Stompjs websocket vue
    GLSL反转矩阵inverse
    【入门向】使用 MetaHook Plus 绘制 HUD
    取文件MD5 WINAPI
    BAD APPLE C++控制台程序
    查看struct或class的内存布局
    让游戏以高性能GPU(独立显卡)运行
  • 原文地址:https://www.cnblogs.com/baitongtong/p/5882552.html
Copyright © 2020-2023  润新知