物理材质的深入思考
序
以静态模型举例, 物理材质是配置在两个地方, 两个地方跟检测方式有关
如果是复杂检测的, 那么物理材质配置在每个材质内, 这个比较精确, 但是开销是非常感人的, 特别是有些次世代模型动辄上百万面
如果是简单检测, 物理材质是统一跟着模型走的, 也就是一个模型不管你配置了多少个碰撞盒子, 物理材质都只有一个, 看下图
图中的正方体和球各自有自己的碰撞框, 如果一个是金属的,一个是橡胶的, 那么此套方案就行不同了
魔改源码
每个碰撞体在模型中都是保存在BodySetup中以FKAggregateGeom数据保存的, 里面保存了所有的FKShapeElem, 即对应各种形状的数据结构
于是可不可以把物理材质放到这里呢?
直接放进去, 记得要兼顾构造函数和一些工具函数
这样就已经可以在编辑器模式下编辑这个物理材质了
接下来要查看射线逻辑中的物理材质是怎么赋值的
具体赋值的是在
1 | SetHitResultFromShapeAndFaceIndex()中 |
见下图
这个环节大致是从具体的三角面中查找材质, 从材质中找到物理材质, 对于简单检测, 这里就会返回简单碰撞设置的物理材质, 这里行不通
所以思考着有没有地方可以找到我们配置的物理材质
这里发现, 射线流程中所传递的我们击中的几何体数据Shape并非是FKAggregateGeom数据, 看下图
这里是因为游戏在运行之初, UE会把生成一套运行时的数据, 如果是PhyX环境可以参考
1 | FPhysicsInterface_PhysX::AddGeometry() |
上面两图可以看到
1 | FKShapeElem的UserData就是他自己 |
而这个UserData是传递到了Shape数据中的用void*保存下来的
再看UE已经封装好了转换函数(下图是PhyX)
那么问题就解决了, 尝试从这个UserData拿到我们 FKShapeElem
中配置的物理材质
最终的配置方式如下
测试一下
搞定