物理材质的深入思考

以静态模型举例, 物理材质是配置在两个地方, 两个地方跟检测方式有关

如果是复杂检测的, 那么物理材质配置在每个材质内, 这个比较精确, 但是开销是非常感人的, 特别是有些次世代模型动辄上百万面

如果是简单检测, 物理材质是统一跟着模型走的, 也就是一个模型不管你配置了多少个碰撞盒子, 物理材质都只有一个, 看下图

image-20220531163529620

图中的正方体和球各自有自己的碰撞框, 如果一个是金属的,一个是橡胶的, 那么此套方案就行不同了

魔改源码

image-20220531163554003

每个碰撞体在模型中都是保存在BodySetup中以FKAggregateGeom数据保存的, 里面保存了所有的FKShapeElem, 即对应各种形状的数据结构

于是可不可以把物理材质放到这里呢?

image-20220531163606551

直接放进去, 记得要兼顾构造函数和一些工具函数

这样就已经可以在编辑器模式下编辑这个物理材质了

image-20220531163616696

接下来要查看射线逻辑中的物理材质是怎么赋值的

具体赋值的是在

1
SetHitResultFromShapeAndFaceIndex()中

见下图

image-20220531163631266

这个环节大致是从具体的三角面中查找材质, 从材质中找到物理材质, 对于简单检测, 这里就会返回简单碰撞设置的物理材质, 这里行不通

所以思考着有没有地方可以找到我们配置的物理材质

这里发现, 射线流程中所传递的我们击中的几何体数据Shape并非是FKAggregateGeom数据, 看下图

image-20220531163641335

这里是因为游戏在运行之初, UE会把生成一套运行时的数据, 如果是PhyX环境可以参考

1
FPhysicsInterface_PhysX::AddGeometry()

image-20220531163653630

image-20220531163703142

上面两图可以看到

1
FKShapeElem的UserData就是他自己

而这个UserData是传递到了Shape数据中的用void*保存下来的

再看UE已经封装好了转换函数(下图是PhyX)

image-20220531163713479

那么问题就解决了, 尝试从这个UserData拿到我们 FKShapeElem中配置的物理材质

image-20220531163722422

最终的配置方式如下

image-20220531175628977

测试一下

录制_2022_05_31_16_49_15_70

搞定