物理修复与相机防穿墙:Jolt Trace 接管(缺省 DummyTrace 带 JPH_ASSERT(false),调试版一被调用即断;同文去重防多线程刷屏);MeshShape 三角索引补基址(此前把 materialIndex/userData 当顶点偏移传 → 每个 mesh 三角全指向前一 mesh 顶点区,碰撞形状错位 + AABBTree 随机分割告警);调试绘制巨型网格三角预算(>5 万三角退化为包围盒线框,避免百万级 DrawLine 打到个位数帧率);角色 mEnhancedInternalEdgeRemoval 消网格地面 ghost contact 顶起/抖动;新增 RayCastStatic(只命中非移动层,碎块/动态物不当遮挡)→ ThirdPersonCamera 防穿墙拉近(瞬时拉近、平滑回弹、贴墙最小距离与回退余量可配)

This commit is contained in:
2026-10-18 15:23:01 +08:00
parent 2024772bac
commit e7711134fe
4 changed files with 149 additions and 5 deletions
@@ -79,6 +79,11 @@ namespace Engine {
bool RayCast(const glm::vec3& origin, const glm::vec3& dir,
f32 maxDist, RayHit& outHit) const;
// 仅命中静态(非移动层)几何:忽略碎块/动态物/NPC。相机防穿墙用它
// ——动态碎块撞进枢轴→相机射线会把镜头乱拉(抖动),静态语义才稳
bool RayCastStatic(const glm::vec3& origin, const glm::vec3& dir,
f32 maxDist, RayHit& outHit) const;
// ---- 刚体驱动(游戏逻辑/编辑器调试;按实体位模式寻址)----
// Jolt 力在每步模拟后清零:游戏逻辑每帧持续施加 = 正确用法;
// 冲量一次性改变动量(自动唤醒休眠体);速度直写会打断自然
@@ -154,6 +159,10 @@ namespace Engine {
JPH::RefConst<JPH::Shape> BuildCompoundShape(ECS::RigidBodyComponent& rb,
ECS::TransformComponent& tr);
void RemoveBody(u32 entityBits);
// RayCast / RayCastStatic 共用实现:layerFilter 为空 = 命中所有层
bool RayCastImpl(const glm::vec3& origin, const glm::vec3& dir,
f32 maxDist, RayHit& outHit,
const JPH::ObjectLayerFilter* layerFilter) const;
const BodyRecord* FindRecord(u32 entityBits) const; // 刚体驱动寻址
CharacterController* FindCharacter(u32 entityBits); // 角色门面寻址
void QueueEvent(CollisionEvent&& ev); // 回调线程 append(多线程并发,加锁)