diff --git a/Engine/include/Engine/Physics/CharacterController.h b/Engine/include/Engine/Physics/CharacterController.h index 11786a2..bbae8fd 100644 --- a/Engine/include/Engine/Physics/CharacterController.h +++ b/Engine/include/Engine/Physics/CharacterController.h @@ -59,6 +59,10 @@ namespace Engine { const Params& GetParams() const { return m_Params; } + // 调试渲染:非 body,PhysicsSystem::DrawBodies 画不到,须手动 + // (脚本在物理位姿/脚底原点处画胶囊线框) + void DebugDraw(JPH::DebugRenderer& renderer) const; + private: Params m_Params; JPH::Ref m_Character; diff --git a/Engine/src/Physics/CharacterController.cpp b/Engine/src/Physics/CharacterController.cpp index ac71dbb..a6e2115 100644 --- a/Engine/src/Physics/CharacterController.cpp +++ b/Engine/src/Physics/CharacterController.cpp @@ -5,6 +5,10 @@ #include #include +#include +#include +#include +#include namespace Engine { @@ -85,4 +89,15 @@ namespace Engine { JPH::RVec3(position.x, position.y, position.z)); } + void CharacterController::DebugDraw(JPH::DebugRenderer &renderer) const { + // 胶囊中心 = 脚底原点 + shapeOffset(角色不旋转,纯平移)。 + // CharacterVirtual 非 body,DrawBodies 永远画不到它——这是 + // Jolt 层面的缺口(连 CharacterVirtual::DebugDraw 都没有) + const JPH::RMat44 t = JPH::RMat44::sTranslation( + m_Character->GetPosition() + + JPH::RVec3(m_Character->GetShapeOffset())); + m_Character->GetShape()->Draw(&renderer, t, JPH::Vec3::sOne(), + JPH::Color::sGreen, false, true); + } + } // namespace Engine diff --git a/Engine/src/Physics/PhysicsWorld.cpp b/Engine/src/Physics/PhysicsWorld.cpp index cc2075b..1cf75b1 100644 --- a/Engine/src/Physics/PhysicsWorld.cpp +++ b/Engine/src/Physics/PhysicsWorld.cpp @@ -326,6 +326,14 @@ namespace Engine { } } + // 4) 角色控制器:CharacterVirtual 非 body,DrawBodies 画不到, + // 手动画胶囊线框(绿 = 与普通 collider 区分) + if ((m_DebugBits & kPhyDbgColliders) != 0) { + for (auto &[bits, entry] : m_Characters) { + entry.cc->DebugDraw(*m_DebugDraw); + } + } + // 释放上一帧缓存不再引用的通用几何 batch(DebugRenderer 内部池) m_DebugDraw->NextFrame(); }