[SceneKit专题]1.Hello SceneKit

96
作者 史前图腾
2017.04.02 22:07* 字数 948

说明

本系列文章是对<3D iOS Games by Tutorials>一书的学习记录和部分翻译,此书对应的代码地址:https://github.com/XanderXu/3D-iOS-Games-by-Tutorials-code
系列文章目录:http://www.jianshu.com/p/fd32aa0d896a

系列文章

1.Hello SceneKit http://www.jianshu.com/p/fd32aa0d896a
2.physics物理效果 http://www.jianshu.com/p/d11befb651c2
3.Render Loop渲染循环 http://www.jianshu.com/p/4f6a8c878465
4.Particle Systems粒子系统 http://www.jianshu.com/p/4d21dca40c7d
5.3D空间的触摸事件 http://www.jianshu.com/p/6328c8d68409
6.Scene Editor场景编辑器 http://www.jianshu.com/p/2058ce941b08
7.Cameras相机 http://www.jianshu.com/p/3d7cc97c47bc
8.Lights灯光 http://www.jianshu.com/p/c18a7f082f49
9.Basic Collision Detection碰撞检测基础 http://www.jianshu.com/p/8e2691143970
10.Materials材质 http://www.jianshu.com/p/936752aff5a3
11.Reference Nodes引用节点 http://www.jianshu.com/p/d5e909c1a54d
12.Shadows阴影 http://www.jianshu.com/p/fb5f2cdb7f9c
13.Intermediate Collision Detection碰撞检测中级 http://www.jianshu.com/p/c7b2e1dd3c91
14.Motion Control运动控制 http://www.jianshu.com/p/046a7c5781b8
15.Transitions转场 http://www.jianshu.com/p/f2c482282e18
16.Actions动作 http://www.jianshu.com/p/ec72ec1a0e4b
17.Audio音频 http://www.jianshu.com/p/49767d2d59b3
18.Mac常用3D工具 http://www.jianshu.com/p/f2663fe7a561
19.MagicaVoxel的使用,3D体素网格建模 http://www.jianshu.com/p/317516ec5344

Scenes:SCNScene

自带一个定义了坐标系的root node(根节点),使用scene gragh来组织场景,可以向内部增加树状结构的内部节点(node),例如 lights光源, cameras相机, geometry几何体, particle emitters粒子发射源.
需要放到SCNView的实例中呈现,SCNView在OSX(macOS)中是NSView的子类,在iOS中是UIView的子类;

左侧树状结构


QQ20170402-175546@2x.png
QQ20170402-175546@2x.png

坐标系,屏幕外是+Z方向,坐标使用向量表示,示例SCNVector3(x: 0, y: 5, z: 10)


QQ20170402-180815@2x.png
QQ20170402-180815@2x.png

Nodes:SCNNode

游戏中的每个元素都被称为node(节点),存放在树状结构scene gragh中,例如 lights光源, cameras相机, geometry几何体, particle emitters粒子发射源.每个scene graph中包含一个特殊的基础节点:root node(根节点),可以把其他节点添加到节点下面,变成它的子节点.

添加到scene中的node,默认在(x:0, y:0, z:0),即相对于父节点的位置.要想调整节点在父节点的位置,应该调整local coordinates(本地坐标系),而不是调整world coordinates(世界坐标系).

注意
默认情况下,如果一个场景中没有任何改变时,Scene Kit会进入"paused"(暂停)状态,为了防止这种情况,需要在创建SCNView实例时设置playing属性为true如

scnView.playing = true

camera

摄像机的显示范围控制,小球zNear不显示,大于zFar不显示.添加到一个空节点的camera属性里


QQ20170402-204457@2x.png
QQ20170402-204457@2x.png
func setupCamera() {
  // 1.创建空的节点
  cameraNode = SCNNode()
  // 2.创建相机,添加到节点中
  cameraNode.camera = SCNCamera()
  // 3.设置相机节点的位置
  cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)
  // 4.添加到根节点中
  scnScene.rootNode.addChildNode(cameraNode)
}

primitives geometry(原生几何体)

系统自带了很多基础的几何体,添加到一个空节点的geometry属性里
第一排从左起:cone(圆锥体), torus(圆环体), capsule(胶囊体), tube(管道)
第二排从左起:pyramid(四棱锥), box(长方体), sphere(球体), cylinder(圆柱体)

QQ20170402-211703@2x.png
QQ20170402-211703@2x.png

SCNView内置属性

// 1.显示统计数据
scnView.showsStatistics = true
// 2.打开相机控制
scnView.allowsCameraControl = true
// 3.自动启用默认光源
scnView.autoenablesDefaultLighting = true

1.showsStatistics在底部显示一个实时的统计条,左侧+号点击可展开;
2.showsStatistics允许使用简单手势控制相机
-单指滑动:旋转相机;
-双指滑动:移动相机;
-双指捏合:缩放;
-双击:如果有两个相机则切换,一个相机则返回原始状态;
3.autoenablesDefaultLighting创建一个通用的全方向光源;

fps:帧率,每秒渲染的画面数
◆:每帧画面渲染的总物体数,多光源照射同一物体时会渲染多次
▲:每帧画面渲染的多边形总数量,
✸:可见的光源总数(影响物体的光源), Scene Kit推荐不要同时使用3个以上光源


QQ20170402-214534@2x.png
QQ20170402-214534@2x.png
QQ20170402-215145@2x.png
QQ20170402-215145@2x.png
SceneKit