SceneKit学习

SceneKit框架使用总结(一)

2017-12-12  本文已影响230人  LeonR

一、认识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 自定义形状 (通过设置贝瑟尔曲线)
上一篇下一篇

猜你喜欢

热点阅读