SceneKit框架使用总结(一)
一、认识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 自定义形状 (通过设置贝瑟尔曲线)