SceneKit开发教程03 | 使用SCNNode && SCNReferenceNode定义场景结构

上一篇介绍了场景(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 五个向量

  • var simdPosition: simd_float3,节点的位置,一个三维向量,描述节点相对于父节点的位置,默认是个零向量,表示当前节点添加在父节点坐标系的原点位置

  • var simdRotation: simd_float4,节点的旋转,一个四维向量,前三维描述旋转轴的方向,第四维描述旋转的角度,默认是零向量,表示没有旋转

  • var simdScale: simd_float3,节点的大小,一个三维向量,表示几何体在每一维上大小缩放系数

  • var simdEulerAngles: simd_float3,节点的欧拉角,一个三维向量,用每一维分别表示 pitch、yaw 和 roll。其中,pitch 表示 节点围绕 X 轴的旋转角度; yaw 表示 节点围绕 Y 轴的旋转角度;roll 表示 节点围绕 Z 轴旋转的角度。我在网上找了一张图片来辅助理解。

image.png

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

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

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

2.2 节点的内容

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

  • var name: String?,顾名思义,节点的名称。给节点起一个可读性较好的名称,方便管理节点,尤其是在读写场景文件的时候。
  • var light: SCNLight?,添加到节点上的灯光,一个节点上只能添加一个灯光。
  • var camera: SCNCamera?,添加到节点上的相机,只有给显示场景的视图的pointOfView属性,设置一个包含相机的节点,视图才能显示场景。这句话读起来比较拗口,举个之前举过的例子来辅助理解,下图是一个拍摄电影的画面:
image.png

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

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

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

  • var geometry: SCNGeometry?,添加到节点上的几何体,一个节点上只能添加一个几何体,要同时控制多个几何体,可以创建一个不包含几何体的节点,给刚创建的节点添加子节点,然后将几何体添加到这些节点上。改变节点的几何属性,可以达到移动、旋转或者缩放附着在上面几何体的目的。
  • var morpher: SCNMorpher?,morpher中文翻译成变形器,这个属性主要用作在多个几何图形之间进行插值,在后面SCNMorpher详细讲解这个属性。
  • var skinner: SCNSkinner?,这个属性和节点内容的骨骼动画相关。
  • var categoryBitMask: Int,给节点添加分类,每个节点可以有多个分类。

2.3 给节点添加约束

2.4 处理节点动画

3. SCNReferenceNode

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

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

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

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

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

SCNReferenceNode 有两个重要的方法:

  • init?(url: URL)方法,使用改方法来实例化SCNReferenceNode,传入的参数是场景文件的地址,注意,新生成的SCNReferenceNode对象是没有“附着”任何内容的,是个空白的node
  • load()方法,只有运行该方法之后,才会将场景文件中的内容,加载到我们上一步实例化的node中

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • (一) AR(增强现实技术)介绍 增强现实(Augmented Reality,简称 AR),是一种实时地计算摄影...
    NewSongs阅读 2,287评论 5 53
  • 本文主要讲解 SCNScene 和 SCNView 相关内容。 0. 写在前面 本文结构如下: 1. SCNSce...
    TankXie阅读 5,265评论 3 6
  • A view for displaying AR experiences that augment the cam...
    loveFBI阅读 2,408评论 0 0
  • 单曲循环五月天的《温柔》郭旭的《不找了》 这两天不断找歌听,希望能有一首歌能让我痛哭一场。眼泪越来越奢侈了,以前...
    小白描阅读 178评论 0 0
  • 150多年来,大本钟用它那浑厚绵长的钟声见证着帝国的繁荣与兴衰。直径7米的钟盘,305公斤的钟摆,13.5吨重的重...
    孟娟游天下阅读 619评论 0 2