【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2372

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1722|回复: 38

[燕良] 3D引擎数据结构与glTF(2): Scene Graph

[复制链接]  [移动端链接]
排名
469
昨日变化
1

50

主题

348

帖子

3105

积分

Rank: 9Rank: 9Rank: 9

UID
30179
好友
31
蛮牛币
2962
威望
0
注册时间
2014-6-18
在线时间
732 小时
最后登录
2018-11-28

专栏作家原创先锋认证开发者

发表于 2017-12-25 11:42:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
[版权声明:本文为燕良原创文章,转载请注明出处:https://neil3d.github.io

图形学中的 Scene Graph


Scene Graph 中文常翻译为“场景图”,是一种常用的场景对象组织方式。我们把场景中的对象,按照一定的规则(通常是空间关系)组织成一棵树,树上的每个节点代表场景中的一个对象。每个节点都可以有零到多个子节点,但只有一个父节点。 每个节点都包含一个“空间的定义”,通过一个 4x4 的矩阵表示,也可以通过位置、旋转、缩放三个分量来表示,但最终都要转换成4x4的矩阵。


每个节点所定义的空间就叫做“Local Space”,每个节点的空间都是定义在父节点的 Local Space 之中的。在渲染某个节点中的 Mesh 模型的时候,需要计算 Model Matrix,也就是需要把顶点从 Local Space 转换到 World Space 的矩阵,这时候就要使用矩阵乘法来计算:


   
nodeA.modelMatrix = nodeA.parent.modelMatrix * nodeA.localMatrix  



请注意这里请求了父节点的 Model Matrix:”nodeA.parent.modelMatrix”,也就是递归的去计算,直到 Scene Graph 的根节点。通常在代码实现中,会把这个 Model Matrix 进行 Cache 。


Scene Graph 的节点层次结构组成的空间关系就像我们高中物理学的相对运动。例如你在一列飞驰的火车上行走,那么你的位置、运动都是在“火车”这个空间中的;而你最终在地球上的运动,要根据当前火车的运动来计算决定。



游戏引擎中的 Scene Graph


Scene Graph 的概念在游戏引擎中也被普遍使用,先来看一下 吧。在 Unity Editor 中我们可以直观的从 Hierarchy 视图中看到整个 Scene Graph 结构。当你移动一个 GameObject 时,它下面的所有子节点也会跟随它一起移动。 从代码的角度看,场景节点中的父子关系并不由 GameObject 负责管理,而是由 Transform 组件去完成。 想要指定或者改变对象的父子关系就需要调用 Transform.SetParent(),这个函数的第二个参数为“bool worldPositionStays”,也就是在改变父节点时保持对象在世界空间中的位置不变。你可以思考一下,如果要你实现这个API,你怎么写?
在 Unreal Engine 4 中也有 Scene Graph 概念的实现,情况与 非常类似。Unreal Editor中的“World Outliner”视图,也直观的展现了当前场景的层次结构。 AActor 在场景中的层次结构是由 USceneComponent 组成父子关系来实现的,USceneComponent 起到管理 transform 和 transform 的层次结构的作用。




glTF 定义的 Scene Graph 数据






在glTF标准中也使用 Scene Graph 的概念。一个 glTF 数据可以包含零到多个 scene ,每个 scene 都是由 node 组成的一个树形层次结构。
在前面一篇文章的glTF简介中,我们讲到了 glTF 的核心数据是由一个 JSON 格式的文本文件定义的。下面我们就先看一下 glTF 中场景的定义:
{   

"scenes": [   
    {
           "name": "defaultScene",
           "nodes": [0]
        }
    ],
    "scene": 0,
     "nodes": [
        {
            "name": "root",
            "children": [1]
        },
        {
           "name": "box",
            "mesh": 0
        }
   ]
}

上面这段 JSON 数据是glTF文件的一部分,它定义了一个 Object ,它有三个重要的字段:



  • scenes:是一个对象数组,定义这个 glTF 数据中有几个场景。上面这段 JSON 数据中只包含一个场景。每个场景是一个对象,包含两个字段:
    • name:字符串,场景的名称;
    • nodes:一个数组,通常只有一个元素,它指定这个场景的根节点;数组的每个元素是下面的 nodes 数组的索引;
  • scene:这个字段指定默认渲染哪个场景,是指定的上面的 scenes 数组的 index;
  • nodes:是一个对象数组,包含所有的节点数据;上面这段 JOSN 数据中一共有两个节点:root 和 box 。
其中,nodes 数组是构成 Scene Graph 的核心数据,下面我们再看一下 nodes 中的单个节点的数据构成。一个节点可以拥有以下的可选字段:
  • name:名称,字符串;
  • children:是一个数组,定义当前这个 node 包含哪些子节点;使用 nodes 数组的 index;
  • transform数据,可以是一个 “matrix” 字段,定义一个4x4的矩阵;也可以由“translation”、“rotation”、“scale ”三个分量来定义。
  • mesh:指定当前节点引用哪个 mesh 对象来渲染;通过 index 索引 glTF 数据中的 mesh 对象;后续文章还会细讲;
  • camera:指定当前节点引用哪个摄像机;通过 index 索引 glTF 数据中的 camera 对象;后续文章还会细讲;

理解了 Scene Graph 的概念之后,再看上述的 glTF 场景数据定义就很直观了。看到这儿,场景的数据结构应该清晰了,但是目前这个场景还没包含任何实际的功能,这个我们要从下一篇文章开始讲起。


回复帖子,阅读原文,可以下载完整的glTF样例模型数据:


https://neil3d.github.io/3dengine/gltf-scene.html















回复

使用道具 举报

7日久生情
4317/5000
排名
2389
昨日变化

5

主题

3108

帖子

4317

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
5
蛮牛币
5515
威望
0
注册时间
2017-3-1
在线时间
631 小时
最后登录
2018-11-8
发表于 2017-12-25 13:45:41 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
3023/5000
排名
350
昨日变化

1

主题

377

帖子

3023

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
2219
好友
1
蛮牛币
8094
威望
0
注册时间
2013-8-19
在线时间
922 小时
最后登录
2018-12-14
发表于 2017-12-25 14:39:20 | 显示全部楼层
排版好乱啊啊职

回复

使用道具 举报

5熟悉之中
591/1000
排名
6889
昨日变化
2

0

主题

285

帖子

591

积分

Rank: 5Rank: 5

UID
250350
好友
2
蛮牛币
588
威望
0
注册时间
2017-10-23
在线时间
124 小时
最后登录
2018-11-10
发表于 2017-12-26 09:52:26 | 显示全部楼层

谢谢分享
[发帖际遇]: 一个袋子砸在了 liuwenjiandm 头上,liuwenjiandm 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

8常驻蛮牛
5264/10000
排名
52
昨日变化

0

主题

304

帖子

5264

积分

Rank: 8Rank: 8

UID
14133
好友
0
蛮牛币
5820
威望
0
注册时间
2014-2-12
在线时间
2106 小时
最后登录
2018-12-14
发表于 2017-12-26 10:01:22 | 显示全部楼层
看看,是个好资源。
[发帖际遇]: leonbeyond007 在论坛发帖时没有注意,被小偷偷去了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
233
昨日变化
1

5

主题

643

帖子

3920

积分

Rank: 11Rank: 11Rank: 11Rank: 11Rank: 11

UID
31708
好友
5
蛮牛币
8100
威望
0
注册时间
2014-6-28
在线时间
1172 小时
最后登录
2018-11-17

活力之星

QQ
发表于 2017-12-26 10:08:46 | 显示全部楼层
RE: 3D引擎数据结构与glTF(2): Scene Graph [修改]

回复 支持 反对

使用道具 举报

5熟悉之中
565/1000
排名
4140
昨日变化
2

0

主题

75

帖子

565

积分

Rank: 5Rank: 5

UID
52730
好友
1
蛮牛币
942
威望
0
注册时间
2014-11-3
在线时间
150 小时
最后登录
2018-10-30
发表于 2017-12-26 10:24:33 | 显示全部楼层
好文章,学习啦。

回复

使用道具 举报

7日久生情
2239/5000
排名
20110
昨日变化
7

2

主题

1853

帖子

2239

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2914
威望
0
注册时间
2016-11-22
在线时间
358 小时
最后登录
2018-12-8
发表于 2017-12-26 10:33:19 | 显示全部楼层
赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

5熟悉之中
834/1000
排名
2727
昨日变化
12

1

主题

61

帖子

834

积分

Rank: 5Rank: 5

UID
226397
好友
1
蛮牛币
1028
威望
0
注册时间
2017-6-12
在线时间
256 小时
最后登录
2018-12-14
发表于 2017-12-26 10:38:06 | 显示全部楼层

回复

使用道具 举报

7日久生情
2747/5000
排名
452
昨日变化

1

主题

323

帖子

2747

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
27816
好友
3
蛮牛币
8806
威望
0
注册时间
2014-6-3
在线时间
877 小时
最后登录
2018-11-13
发表于 2017-12-26 11:04:50 | 显示全部楼层
学习学习

回复

使用道具 举报

7日久生情
2253/5000
排名
1818
昨日变化
6

1

主题

944

帖子

2253

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
216583
好友
2
蛮牛币
3714
威望
0
注册时间
2017-4-7
在线时间
596 小时
最后登录
2018-12-14
发表于 2017-12-26 11:27:32 | 显示全部楼层
多谢分享

回复

使用道具 举报

7日久生情
2390/5000
排名
835
昨日变化
1

1

主题

191

帖子

2390

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
124540
好友
1
蛮牛币
2170
威望
0
注册时间
2015-10-4
在线时间
1034 小时
最后登录
2018-12-9
发表于 2017-12-26 11:49:08 | 显示全部楼层
本帖最后由 superowner 于 2017-12-26 11:50 编辑

你好,新版的GLTF的Unity版的动画加载有进展了吗?因为之前看到只支持第一版的动画,但是第二版好像不支持解析第一版的动画了

回复 支持 反对

使用道具 举报

5熟悉之中
796/1000
排名
2615
昨日变化
9

0

主题

43

帖子

796

积分

Rank: 5Rank: 5

UID
113567
好友
0
蛮牛币
1039
威望
0
注册时间
2015-7-14
在线时间
219 小时
最后登录
2018-12-13
发表于 2017-12-26 12:03:59 | 显示全部楼层
谢谢分享!!!

回复

使用道具 举报

5熟悉之中
849/1000
排名
5615
昨日变化
3

0

主题

438

帖子

849

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2749
威望
0
注册时间
2016-4-25
在线时间
169 小时
最后登录
2018-12-10
QQ
发表于 2017-12-26 14:00:03 | 显示全部楼层
有些意思,多多学习

回复 支持 反对

使用道具 举报

3偶尔光临
223/300
排名
10679
昨日变化
5

0

主题

39

帖子

223

积分

Rank: 3Rank: 3Rank: 3

UID
192579
好友
0
蛮牛币
399
威望
0
注册时间
2016-12-15
在线时间
94 小时
最后登录
2018-6-26
发表于 2017-12-26 17:40:17 | 显示全部楼层
瞅瞅 还要写10多个字节 哎哎哎

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表