NFC

SceneKit开发教程03 | 使用SCNNode &

2018-06-04  本文已影响891人  TankXie

上一篇介绍了场景(SCNScene)和视图(SCNView)相关的内容,本节介绍 和节点相关的内容。

0. 写在前面

在SceneKit场景中,把节点的层次树结构称为场景图,场景中的节点可以分为两类:

SceneKit在视图中显示场景,处理场景图并执行动画,然后通过GPU逐帧渲染出来。

在使用SceneKit之前,您应该熟悉基本的图形概念,例如坐标系和立体几何。 SceneKit使用右手坐标系,其中(默认情况下)视图的方向沿着负z轴,如下所示:

SceneKit坐标系.png

其实SceneKit构建的3D空间可以和UIKit构建的3D空间对比理解,画了一张草图可以对比理解:

image.png

2. SCNNode

场景图的结构元素,表示3D坐标空间中的位置变换,可以将几何体,灯光,相机或其他可显示内容附加到节点上。

注意:SCNNoad对象本身没有可见内容,它只代表相对于它的父节点的坐标空间变换(位置、方向和尺寸)。为了构建场景的时候,使用节点的层次结构来创建其结构,然后向节点添加灯、相机和几何体以创建可视内容。

2.1 创建一个节点

SCNNode提供了两个init方法来创建节点对象:

2.1 节点的变换(transform)

和节点变换相关的属性很重要,它们直接影响了节点的位置、大小以及动画。

节点的转换对于开发者来说很重要,主要原因有两点:

要掌握这部分内容,就要弄清楚“两个矩阵”和“五个向量”。

2.1.1 两个矩阵

simdPivot

pivot的意思是枢轴、中心点。所以这个矩阵我称之为枢轴矩阵,在SCNNode中,API定义如下:

节点的“枢轴”表示节点坐标空间之间的转换,它还会被simdPosition、simdRotation和simdScale属性使用。
枢轴矩阵的默认值是4x4的单位矩阵,表示 :

  1. 节点的位置在其坐标系的原点位置,
  2. 节点的旋转轴是穿过其中心点的轴,
  3. 节点的缩放也是相当对其中心点的。

simdTransform

变换矩阵,表示当前节点相对于父节点的变换,默认值是4x4的单位矩阵。它由节点的simdRotation、simdPosition、和 simdScale 属性组成。

当改变节点的simdTransform属性,节点的simdRotation、simdOrientation、simdEulerAngles、simdPosition 和 simdScale 属性会随着自动变化。反之亦然。

2.1.2 五个向量

image.png

要注意理解simdRotationsimdEularAngles 的联系和区别。

simd 什么意思](https://stackoverflow.com/questions/44756858/what-does-the-simd-prefix-mean-in-scenekit)。

这一小节弄清楚了节点在场景中的位置,下一节介绍节点的内容,也就是场景中的可视部分。

2.2 节点的内容

这一小节介绍,节点包含的内容。

image.png

SceneKit中的场景可以和我们在电影院看到的电影场景对应起来,SceneKit中相机可以和拍摄电影的摄像机对应起来。

我们在电影院看到的电影画面,本质上是从相机角度看到的场景,所以说如果没有相机或者相机坏了,接下来发生的场景我们就看不到了!

在SceneKit中也是一样,场景中如果没有包含相机的节点,我们也不到东西。如果我们想多角度的观看场景,那就必须在场景中添加多个包含相机的节点。关于更多相机的信息,在SCNCamera章节详细讲解。

2.3 给节点添加约束

2.4 处理节点动画

3. SCNReferenceNode

SCNReferenceNode是用来从场景文件中加载node。

接下来分析一下这个类,加深对它的理解!

reference ,引用的意思,这个词在oc中很常见,一个实例的引用,表示指向该实例的指针。

那么,reference node 到底是什么意思?我们先给SCNReferenceNode下一个定义:

SCNReferenceNode 是 SCNNode的一个子类,用来表示从外部场景文件中加载的node。

SCNReferenceNode 有两个重要的方法:

结合上面两个方法可以看出,我新实例化的SCNReferenceNode是没有内容的,它只是一个引用,指向外部场景文件的某些内容,只有当我们运行load()方法之后,这些"外部场景文件中的内容"才会加载进来!!!!

所以,我们前面给出的,对SCNReferenceNode的定义不是很准确,我们需要重新描述一下:

SCNReferenceNode 是 SCNNode的一个子类,SCNReferenceNode实例在调用load()方法之前,它只是一个空的占位符,在调用load()方法之后,它用来呈现“外部的场景文件中的内容”

SceneKit | 加载 3D模型(obj/scn/dae)到你的AR项目中 中,给出的有从文件加载SCNReferenceNode的示例,有需要可以移步!

上一篇 下一篇

猜你喜欢

热点阅读