美文网首页 SceneKit学习
SceneKit框架使用总结(一)

SceneKit框架使用总结(一)

作者: LeonR | 来源:发表于2017-12-12 20:39 被阅读230次

    一、认识SceneKit

    SceneKit 是基于OpenGL 的苹果原生 3D框架,伴随AR、VR在国内的升温,该框架也越来越受到开发者的关注,从WWWDC2012 至今,苹果也陆续对该框架进行的升级,使其功能变得强大,不仅支持常见的节点约束,粒子动画,骨骼动画等强大特性,还可以与其他已有图形框架进行整合,如CoreAnimation,CoreImage等。

    对于iOS开发者来说,想进行3D内容视觉展示开发,目前有三个选择,Metal、OpenGL ES 、SceneKit,SceneKit提供了大量的API接口,基本上能够满足大部分需求,也支持直接调用底层API或者自己手动渲染,并且相比较于前两个框架更容易学习,掌握。

    二、SceneKit 基础知识点

    SceneKit使用的右手坐标,我们可以伸出右手面向自己,右手大拇指指向右,代表X轴,食指指向上,代表Y轴,中指指向自己,代表Z轴,这样我们就可以轻易的记住坐标系,并且我们还会发现,当我们旋转X轴时(大拇指),Y、Z轴发生变动,同理旋转Y轴时,X、Z轴会发生变动,Z轴旋转时,X、Y轴会发生变动,在处理旋转问题时,不妨伸出自己的右手,也许会有事倍功半的效果。


    右手坐标系.jpg

    三、SceneKit 主要的类及其常用属性

    1、SCNView

    是3D内容的载体,其父类是UIView,所以也能够将SCNView加载到项目的视图中去,对老项目进行迭代升级,想加入3D元素,使用SCNView就能很好的嵌入其中。

    2、SCNScene

    是3D世界的场景,承载所有的3D元素,比如灯光,3D模型,地面等。

    3、SCNode

    节点,在3D场景中所有的3D元素都是加载在根节点上的,场景Scene就是rootNode,每个加载到根节点上的子节点都有自己的坐标体系。

    SCNView * scnView = [[SCNView alloc]initWithFrame:self.view.bounds];
    
    SCNScene * scene = [SCNScene scene];
    
    SCNNode * node = [SCNNode node];
    
    [scene.rootNode addChildNode:node];
    
    scnView.scene = scene;
    

    上诉三个类是一个三维世界的最基本构成,但还不够完整,我们会在接下来的内容中一步一步完善这个世界,使用SceneKit进行编程时,会经常看见它们的身影。

    4、SCNLight

    在这个刚建立的3D世界中,还是沉默在一片黑暗之中,这个时候苹果老爹给了我们一束光 SCNLight。

    SCNLight * mlight = [SCNLight light];  //初始化一道光
    
    mlight.color = [UIColor yellowColor]; //设置光的颜色
    
    mlight.type = SCNLightTypeOmni; //设置光的类型
    
    SCNLightTypeOmni 点光源:在一个指定位置,360度射出光线,可以衰减
    
    SCNLightTypeAmbient 环境光:没有方向,均匀的射在物体上
    
    SCNLightTypeDirectional :平行光:朝一个方向进行照射,不会衰减
    
    SCNLightTypeSpot:聚焦光源,有固定位置,有照射方向和照射区域
    
    mlight.castsShadow = YES; //设置支持阴影投射
    

    5、SCNCamera

    SCNCamera相当于人类的眼睛,用于观察3D世界。
    
    SCNCamera * camera = [SCNCamera camera]; // 初始化相机
    
    camera.fieldOfView = 130; // 相机的视野,左右上下所能扑捉到物体的最大角度
    
    camera.zNear = 2; // 照相机照到最近的距离
    
    camera.zFar = 50; // 照相机照到最远的距离
    
    camera.automaticallyAdjustsZRange = YES; // 自动调节照相机距离
    
    camera.usesOrthographicProjection = YES; // 正投影
    
    camera.orthographicScale = 2; // 正投影比例 默认是 1 设置比例越大 图像越小
    
    camera.focusDistance = 20; // 焦距 默认是 10
    
    camera.fStop = 0;  // 聚焦时的模糊程度 默认 0
    
    CGFloat apertureSpeed = camera.sensorHeight/camera.fStop; // 离开焦距 和 进入焦距的 速度
    
    self.scnView.pointOfView = self.cameraNode; // 切换视角,一个场景可以存在多个相机,可以在多个node上设置照相机,调用上方法就可以做到视角的切换
    
    

    6、 SCNGeometry 几何体类

    SceneKit 为我们提供了极其常见的几何模型建立方法,使用SCNGeometry子类的类方法就可以快速建立出来(类方法名开头与类名相同,用Xcode自动补齐)。

    比如,设置一个环面,根据参数名马上就能知其意。

    SCNTorus * torus = [SCNTorus torusWithRingRadius:0.3 pipeRadius:0.3];
    
    //同理,下面的类都可以这么使用
    
    SCNBox 正方体      SCNFloor 地面    SCNPyramid 金字塔
    
    SCNTube 管道       SCNSphere 球体   SCNCylinder 圆柱体
    
    SCNCone 圆锥体   SCNText 3D文字   SCNShape 自定义形状 (通过设置贝瑟尔曲线)
    

    相关文章

      网友评论

        本文标题:SceneKit框架使用总结(一)

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