您需要 登录 才可以下载或查看,没有账号?注册
x
一、前言
在游戏引擎中,习惯性的把游戏对象组织成层次化结构,比如下图(1)所示,有时候这个层次化结构非常深:
图(1)
那么,一个很实际的问题,有没有办法简化这个层次的深度?或者说:是否存在一个有限深度d,其他任意层次深度可以简化成深度d,下面我们讲探索这个问题,并给出一个答案:d = 2。也就是说,在不考虑便捷性的情况下,任意深度的游戏对象可以简化成只有两层深度的游戏对象。
二、理论
我们知道游戏对象有世界位置和世界旋转,这两个变换实际上可以坍缩到一层,因此这两个变换并不能阻碍我们的简化过程,挡在我们道路上的是伸缩变换,这个变换没有直接的世界变换(Unity3D中有一个lossyScale),看起来束手无策?那么有没有办法呢?答案肯定是肯定的!
我们可以从矩阵的分解算法中寻找灵感:Singular Value Decomposition。SVD算法可以把一个矩阵分解成一个旋转变换加一个伸缩变换加另一个旋转变换,我们只要把游戏对象的变换矩阵localToWorldMatrix的伸缩旋转核放到SVD中,出来的就是三个变换,我们用(U, S, VI)表示,再加上世界位置P,我们就可以用一个四元组(P, U, S, VI)表示这个对象的localToWorldMatrix变换,用语言描述一遍:一个任意深层次的游戏对象到世界坐标系的变换可以简化成如下四步:
1. 用VI对该对象做旋转
2. 用S对该对象做伸缩
3. 用U对该对象做旋转
4. 用P对该对象做位移。
我们可以很容易的知道,四元组(P, U, S, VI)可以用一个两层结构完全表示,第二层的localRotation = VI,第一层的localPosition = P, localRotation = U, localScale = S。
也就是说,任意深度的游戏对象可以简化成只有两层深度的游戏对象。
|