- Published on
物理材质的深入思考
- Authors

- Name
- 东哥
序
以静态模型举例, 物理材质是配置在两个地方, 两个地方跟检测方式有关
如果是复杂检测的, 那么物理材质配置在每个材质内, 这个比较精确, 但是开销是非常感人的, 特别是有些次世代模型动辄上百万面
如果是简单检测, 物理材质是统一跟着模型走的, 也就是一个模型不管你配置了多少个碰撞盒子, 物理材质都只有一个, 看下图

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

每个碰撞体在模型中都是保存在BodySetup中以FKAggregateGeom数据保存的, 里面保存了所有的FKShapeElem, 即对应各种形状的数据结构
于是可不可以把物理材质放到这里呢?

直接放进去, 记得要兼顾构造函数和一些工具函数
这样就已经可以在编辑器模式下编辑这个物理材质了

接下来要查看射线逻辑中的物理材质是怎么赋值的
具体赋值的是在
SetHitResultFromShapeAndFaceIndex()中
见下图

这个环节大致是从具体的三角面中查找材质, 从材质中找到物理材质, 对于简单检测, 这里就会返回简单碰撞设置的物理材质, 这里行不通
所以思考着有没有地方可以找到我们配置的物理材质
这里发现, 射线流程中所传递的我们击中的几何体数据Shape并非是FKAggregateGeom数据, 看下图

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


上面两图可以看到
FKShapeElem的UserData就是他自己
而这个UserData是传递到了Shape数据中的用void*保存下来的
再看UE已经封装好了转换函数(下图是PhyX)

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

最终的配置方式如下

测试一下

搞定