[计算机] 游戏空间矩阵变化的深度探索2

查看:570 |回复:0 | 2018-1-5 18:21:55

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

x
有了理论,我们来实践一把。首先,我们得搞定SVD算法,这个难不倒我,matlab有现成的库,我们写一个my_svd,内容如下图(2)所示:

110517a41gsu45e0e45014.jpg
图(2)

  可以看到,my_svd实现了svd的功能,并且是对M的伸缩变换做的。

  写完之后,我们用matlab中的matlab coder工代码生成功能,生成一个my_svd.dll(使用matlabr2016a,vs2015)。然后把my_svd.dll拷贝到Assets/Plugins目录下,新建一个脚本TestScaleRotate.cs,在脚本里导入我们的my_svd.dll,如下图(3)所示:

110517h8x1uy1pbpx0zzbw.jpg
图(3)

  开始时,要调用my_svd_initialize(),结束时,调用my_svd_terminate(),非常的方便。

  然后我们建立一个如下图(4)所示的场景

图(4)

  我们把TestScaleRotate.cs挂到CubeCopy对象上,让CubeCopy来复制Cube的TRS变换。

  TestScaleRotate.cs的主要内容如下图(5)所示(src指向Cube的Transform):

图(5)

  代码意思就是拷贝我们之前的讨论,把src.localToWorldMatrix分解成(P, U, S, V),把P赋值给transform.parent.localPosition,U, S, V分别赋值给CubeCopy的三元组。产生的效果如下图(6)所示,可以看到,Mesh严丝合缝的一致,但BoxCollider不是(绿色的框),因为BoxCollider是按lossyScale伸缩的。

图(6)

  四、讨论

  说了这么多,那么这个实际上有什么用呢?实际上是有用的,搞过PhysX的人都知道:PhysX里的Transform只有两层结构PxActor及PxShape,这样的设计大大简化了PhysX,同时又能保证其具有完备的能力。当然,基本物理组件里(Box, Sphere等)没有scale这个属性,只有在Mesh, HeightField里有PxMeshScale属性。因此对于基本物理组件,无法在物理中完备表示,因此只能用lossyScale来表示伸缩。

  另外,本文中的一个重要结论:任意TRS组合可以表示成(P, U, S, V)。可以用于简化Transform计算,比如某些动画。或者如果Transform的读写由于层数太多而导致性能问题,也有优化的基础。

评分

参与人数 1元素币 +10 活跃度 +15 展开 理由
首席游骑兵 + 10 + 15 不错 很深奥

查看全部评分

2018-1-5 18:21:55  
 赞 赞 0

使用道具 登录

0个回答,把该问题分享到群,邀请大神一起回答。

CG 游戏行业专业问题

综合文库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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