资讯动态

Jolt Physics 样例程序(Samples)完全指南:菜单、控制与测试场景解析

发布时间:2026/10/15 16:30:11 来源:尧图企业网站定制
游戏开发图形学【免费下载链接】PiccoloPiccolo (formerly Pilot) – mini game engine for games104项目地址https://gitcode.com/gh_mirrors/pi/Piccolo点击查看免费下载本文以 Samples.md 为骨架结合 SamplesApp.cpp 与 SamplesApp.h 源码系统讲解 Jolt Physics 官方样例程序Samples的启动方式、主菜单每一项的用途、全部快捷键以及 11 大测试类别背后的物理特性与对应源码实现。读完本文你将能够熟练驱动 Samples 程序验证车辆、布娃娃、角色、水、约束、形状缩放、连续碰撞检测与多线程岛模拟等能力并理解每个交互背后的PhysicsSystem调用链。1. 程序概览一个可交互的物理沙盒Jolt Physics 的 Samples 是一个独立的可执行程序用于演示并验证引擎的每一项物理能力从车辆约束VehicleConstraint、布娃娃Ragdoll、角色控制Character/CharacterVirtual到水浮力、各类约束、形状缩放以及连续碰撞检测CCD等。它同时承担着回归测试沙盒的角色——在提交代码改动前你可以通过Run All Tests让程序自动把全部测试各跑 10 秒直观检查模拟是否正常。在 Piccolo 仓库中Samples 与 JoltPhysics 本体一同以第三方库形式提供位于 engine/3rdparty/JoltPhysics/Samples。根据 Samples.md 的说明该示例目前仅在 Windows 下编译这与 Samples.cmake 中链接d3d12.lib、shcore.lib并依赖 D3D12 渲染后端的配置一致。程序启动后默认处于暂停状态需要按P键解除暂停按ESC打开主菜单。菜单结构、全部快捷键以及各类测试的细节如下。2. 主菜单逐项解析按ESC弹出的主菜单由 SamplesApp.cpp 中SamplesApp构造函数内的mDebugUI-CreateMenu()/CreateTextButton()构建。菜单项与对应回调如下菜单项作用源码位置SamplesApp.cppSelect Test按类别浏览并选择要运行的测试L330-L342Test Settings打开当前测试的可配置项测试不支持时置灰L343-L347Restart Test (R)将当前测试重置回初始状态L348Run All Tests自动依次运行全部测试每个 10 秒L349实现见 L576-L588Next Test (N)在自动连跑时快速跳到下一个测试L350实现见 L590-L618Take Snapshot将当前物理世界快照保存为snapshot.binL352实现见 L640-L651Take And Reload Snapshot保存快照后立即重新加载进入 LoadSnapshotTestL353实现见 L653-L658Physics Settings物理模拟全局参数调节详见下文L354-L378Drawing Options物理内部状态的调试绘制开关L379-L414Mouse Probe切换多种碰撞检测探测模式L415-L432Shoot Object向模拟世界发射物体快捷键 BL433-L446Help快捷帮助文本L447-L462几点细节值得说明菜单驱动测试切换Select Test会遍历 SamplesApp.cpp 中定义的sAllCategories分类表二级菜单列出类别内所有测试点击后通过StartTest(c.mTests[j].mRTTI)启动。每个测试类通过JPH_IMPLEMENT_RTTI_VIRTUAL注册RTTI 工厂机制负责实例化。自动连跑机制RunAllTests()把全部测试的 RTTI 压入mTestsToRun队列NextTest()为每个测试设置mTestTimeLeft 10.0fCheckNextTest()在 SamplesApp.cpp 中按物理更新时间递减计时超时即启动下一个测试。支持命令行参数alltests直接进入该模式见下文第 8 节。测试重置StartTest()SamplesApp.cpp会销毁旧测试与旧PhysicsSystem以固定的cNumBodies10240、cMaxBodyPairs65536、cMaxContactConstraints10240等参数重新初始化物理系统调用mTest-Initialize()并OptimizeBroadPhase()优化宽相位最后恢复为暂停状态并单步一帧——因此每次切换测试都会看到程序停在一帧初始画面上按P开始。3. 通用控制与快捷键Samples.md 列出了完整按键表且均能在 SamplesApp.cpp 的键盘处理逻辑中找到对应实现按键功能鼠标 WASD自由飞行相机按住 Shift 加速按住 Ctrl 减速Space按住拾起准星正中的物体并用鼠标/WASD 拖拽P暂停 / 继续模拟O单步推进一帧,逗号回退一帧需开启 Physics Settings / Record State for Playback.句点前进一帧同上Shift ,倒放同上Shift .快进回放同上T输出帧耗时到profile_*.html需编译时定义JPH_PROFILE_ENABLEDB发射物体同 Shoot Object 菜单按钮R重启当前测试N跳到下一个测试自动连跑时有效C切换绘制约束L切换绘制约束限位M切换绘制接触流形1 / 2 / 3切换绘制接触点 / 支撑面 / 接触点简化H切换绘制形状ShiftH 绘制 GetSupport 函数AltH 用 GetTriangles 绘制AltW切换线框绘制I切换绘制质量与惯性张量F / ShiftF绘制支撑面AltF略其中Space拖拽的实现很有学习价值它并非直接抓取物体而是用DistanceConstraintSettings创建一条距离约束把被拖物体与一个不可见、不参与碰撞的静态锚点小球SphereShape(0.01f)相连锚点跟随准星位置移动从而拖动物体见 SamplesApp.cpp。松开 Space 后约束被移除、锚点被销毁。4. Physics Settings物理引擎全局参数该菜单SamplesApp.cpp直接读写mPhysicsSettingsPhysicsSettings结构体并实时生效便于直观感受每个参数对模拟的影响。参数表如下参数滑块范围默认值说明Max Concurrent Jobs1 ~ 硬件线程数thread::hardware_concurrency()并行任务数改变后重建线程池Gravity (m/s²)0.0 ~ 20.09.81重力加速度作用于 Y 轴负方向Update Frequency (Hz)7.5 ~ 120.060.0物理固定步长频率delta_time 1/frequencyNum Collision Steps1 ~ 41每次物理更新的碰撞检测步数Num Integration Sub Steps1 ~ 41每次物理更新的积分子步数Num Velocity Steps0 ~ 30见 PhysicsSettings速度求解迭代次数Num Position Steps0 ~ 30见 PhysicsSettings位置求解迭代次数Baumgarte Stabilization Factor0.01 ~ 1.0见 PhysicsSettings位置误差修正系数Baumgarte 稳定化Speculative Contact Distance (m)0.0 ~ 0.1见 PhysicsSettings推测性接触距离用于高速物体预碰撞Penetration Slop (m)0.0 ~ 0.1见 PhysicsSettings允许的穿透余量Min Velocity For Restitution (m/s)0.0 ~ 10.0见 PhysicsSettings触发恢复弹性所需的最小相对速度Time Before Sleep (s)0.1 ~ 1.0见 PhysicsSettings物体进入睡眠前的静止时长Point Velocity Sleep Threshold (m/s)0.01 ~ 1.0见 PhysicsSettings判定睡眠的点速度阈值此外还提供以下复选项Constraint Warm Starting约束热启动利用上一帧求解结果加速收敛Use Body Pair Contact Contact Cache物体对接触缓存Contact Manifold Reduction接触流形简化Allow Sleeping允许物体睡眠见下图布娃娃堆叠中的红/黄着色Check Active Triangle Edges网格内部活动边检测影响物体沿三角网格滑行的表现Record State For Playback录制每帧物理状态供,/.回放对应mRecordStateCheck Determinism确定性校验——每帧更新后回滚状态并重新模拟一次比对两次结果是否逐字节一致实现见 SamplesApp.cpp 与ValidateState()L2141-L2159Install Contact Listener安装ContactListenerImpl作为接触监听器5. Drawing Options物理内部状态可视化该菜单仅在编译期定义JPH_DEBUG_RENDERER时可用SamplesApp.cpp用于调试物理模拟的内部结构。核心开关包括Draw ShapesH、Draw Shapes WireframeAltWDraw Shape Color按 Instance / Shape Type / Motion Type / Sleep / Island / Material 六种维度着色——Island 着色即可视化多线程岛模拟时各岛的独立颜色Draw ConstraintsC、Draw Constraint LimitsL、Draw Constraint Reference FrameDraw Contact Point1、Draw Supporting Faces2、Draw Contact Point Reduction3、Draw Contact ManifoldsMDraw Bounding Boxes、Draw Center of Mass Transforms、Draw World Transforms、Draw VelocityDraw Mass and InertiaI、Draw Sleep StatsDraw GetSupport Cvx RadiusShiftH、Draw GetSupportingFaceShiftFDraw Mesh Shape Triangle Groups / Outlines、Draw Height Field Shape Triangle OutlinesDraw Submerged Volumes水模拟排量可视化Draw Character Virtual Constraints / Walk Stairs角色虚拟体这些开关底层对应mPhysicsSystem-DrawBodies()、DrawConstraints()、DrawConstraintLimits()等调用见 SamplesApp.cpp。6. Mouse Probe 与 Shoot Object交互式碰撞查询6.1 Mouse Probe14 种碰撞探测模式Mouse Probe菜单SamplesApp.cpp把准星指向的位置作为查询起点演示 Jolt 的全部碰撞查询 API实现集中在CastProbe()L847-L1564。模式如下模式底层调用NarrowPhaseQuery / BroadPhaseQueryPickCastRay仅 MOVING 层——用于拾取物体RayCastRay并绘制材质名、法线RayCollectorCastRay 收集器Any/Closest/AllHit支持背面模式、凸体实心、最大命中数CollidePointCollidePoint返回包含该点的物体CollideShapeCollideShape形状对撞绘制接触点、穿透轴、接触面CastShapeCastShape形状投射扫掠可开启收缩形状凸半径TransfShapeCollectTransformedShapes收集包围盒内所有变换后形状GetTrianglesGetTrianglesStart/Next流式取三角形并绘制BP Ray / BP Box / BP Sphere / BP Point / BP OBox / BP Cast Box直接查询宽相位BroadPhase的六种原语查询配套的可调参数包括探测形状Sphere / Box / ConvexHull / Capsule / TaperedCapsule / Cylinder / Triangle / StaticCompound / MutableCompound、三轴缩放-5 ~ 5、Back Face Cull、Active Edge Mode、Collect Faces Mode、Max Separation Distance0 ~ 5、Treat Convex As Solid、Return Deepest Point、Max Hits0 ~ 10。不同形状对缩放有各自约束例如球与胶囊只支持均匀缩放代码中scale.SwizzleX,X,X()圆柱要求 X 与 Z 缩放一致见 SamplesApp.cpp。6.2 Shoot Object参数化发射Shoot ObjectSamplesApp.cpp通过ShootObject()L834-L845创建BodyCreationSettings并CreateAndAddBody发射物体参数包括Initial Velocity0 ~ 500 m/s默认 20.0ShapeSphere / ConvexHull / Thin BarMotion QualityDiscrete / LinearCast后者启用连续碰撞检测高速不穿透Friction0 ~ 1.0默认 0.2Restitution0 ~ 1.0默认 0.0Scale Shape三轴 -5 ~ 5发射方向取相机前方GetCamera().mForward即朝准星方向发射。这是验证 CCD 与高速碰撞最直观的工具——把速度拉到 500、Motion Quality 设为 Discrete可以看到薄墙被穿过切到 LinearCast 后则不再穿透。7. 测试类别全景从车辆到形状缩放Samples.md 按 7 大类组织演示视频结合 SamplesApp.cpp 的sAllCategories实际菜单共 11 个类别、约 130 个测试。以下按原文档顺序逐一展开7.1 Vehicles基于 VehicleConstraint 的载具该类演示通过VehicleConstraint创建的载具用射线或形状投射ray/shape cast检测地面接触并模拟发动机、变速箱、差速器与悬挂系统。Car (VehicleConstraint)VehicleConstraintTest.cpp四轮车车身 1500kg带两个差速器前轮转向、后轮驱动与两组防倾杆anti rollbar前轮mMaxHandBrakeTorque 0无手刹后轮默认有手刹碰撞检测器可选VehicleCollisionTesterRay射线或VehicleCollisionTesterCastSphere球体投射。方向盘最大转角 30°悬挂最小/最大行程 0.3m/0.5m。Tank (VehicleConstraint)TankTest.cpp履带式坦克通过TrackedVehicleController控制9 个负重轮炮塔通过hinge 铰链约束与车体连接文档原话a tracked vehicle with a turret constrained to the main body with hinge constraints并借助GroupFilterTable防止车体、炮塔、炮管之间自碰撞。Car (SixDOFConstraint)用 SixDOFConstraint 实现车辆的替代方案。7.2 Rig (Ragdolls)布娃娃的构建与控制该类演示布娃娃的创建与两种控制方式关键帧驱动keyframing与马达驱动motors。Create Rig / Load Rig从Assets/Human.tof加载骨骼装配KinematicRigTest.cpp 使用RagdollLoader::sLoad(Assets/Human.tof, ...)。Kinematic Rig布娃娃设为Kinematic 模式infinite mass, simulated using velocities only——以无限质量、仅用速度驱动的方式运动可与动态物体交互。Powered Rig马达驱动的布娃娃动画被采样到SkeletonPose后马达在局部空间驱动各关节逼近动画姿势文档中的green sticks即骨骼绘制。Rig Pile160 个布娃娃从《地平线零之曙光》场景落下堆积结合 Sleeping 可视化黄色表示仍在模拟红色表示已睡眠直观展示睡眠系统与多体堆叠稳定性。160 Ragdolls Driven to Pose一堆布娃娃被驱动到指定死亡姿势动画从而获得刚性stiffness。7.3 Character胶囊体人形角色该类演示用胶囊体capsule模拟人形角色CharacterTest使用Character基于动力学角色CharacterVirtualTest使用CharacterVirtual虚拟角色。文档要点moving, sliding against the environment, crouching and jumping——移动、贴环境滑动、下蹲与跳跃。CharacterTest::Initialize()设置了最大坡角 45°、摩擦 0.5并通过PostSimulation(cCollisionTolerance)每帧刷新地面属性CharacterTest.cpp。7.4 Water水模拟WaterShapeTestWaterShapeTest.cpp在静止水面上投放多种形状缩放盒、盒、球、静态复合体、四面体ConvexHull、非均匀缩放四面体等演示浮力与摩擦力对不同形状及复合形状的影响——The right most object has a lowered center of mass最右侧物体降低了质心使用OffsetCenterOfMassShape因此入水姿态不同。配合 Drawing Options 的 Draw Submerged Volumes 可查看浸没体积的计算结果。7.5 Constraints约束体系约束将两个或多个刚体连接并限制其相对运动。sConstraintTests共 15 个测试SamplesApp.cppPoint、Distance、Hinge、Powered Hinge、Slider、Powered Slider、Fixed、Cone、Swing Twist、Powered Swing Twist、Swing Twist Friction、SixDOF、Path、Spring、Constraint Singularity。Path Constraint让物体沿预定义路径运动文档演示视频即展示其在动作中的效果。Swing Twist Constraint文档原话指出该约束usable for humanoid shoulders适用于人形肩膀并以绿色锥体表示 swing 限位、粉色扇形表示 twist 限位。SwingTwistConstraintTest.cpp 构建了一条 10 节胶囊体链每对相邻段之间以SwingTwistConstraintSettings连接twist 轴沿 X、plane 轴沿 Y并可在 Test Settings 菜单中实时调整 Min/Max Twist Angle-180°~180°与 Normal/Plane Half Cone Angle0°~180°。下图为该约束的可视化示意来自 Docs/SwingTwistConstraint.png7.6 General通用模拟测试该类覆盖摩擦、恢复系数restitution、阻尼、重力修改、连续碰撞检测等基础物理现象共 27 个测试。文档点名的几个亮点Stable Box Stacking箱堆稳定性测试StackTest。Active Edge Detection物体沿多边形网格滑行时忽略网格内部边避免内部边造成弹跳ActiveEdgesTest对应 Physics Settings 中的 Check Active Triangle Edges。Funnel Test1000 个随机形状球/盒/凸包/胶囊/锥形胶囊/圆柱/复合体等随机位置、随机三轴缩放落入漏斗FunnelTest.cpp是形状系统与多体交互的压测。Multithreaded Island Simulation模拟被自动切分为**互不交互的岛islands**并分发到多线程执行每个岛一种颜色——该着色可在 Drawing Options / Draw Shape Color 中选择 Island 查看。7.7 Shapes 与 Scaled Shapes形状体系与运行时缩放Shapes类别13 个测试展示全部受支持形状Sphere、Box、Capsule、Tapered Capsule、Cylinder、Convex Hull、Mesh、Height Field、Static Compound、Mutable Compound、Triangle、Rotated Translated、Offset Center Of Mass。SamplesApp.cppScaled Shapes类别12 个测试演示运行时形状缩放的四种形态Uniform均匀、Non uniform非均匀、Mirrored镜像负缩放、Inside out内翻负缩放的复合效果文档视频中即展示了高度场形状在四种缩放下的表现。缩放通过ScaledShape包装实现也支撑了上文 Mouse Probe / Shoot Object 中的 Scale 参数。8. 命令行参数与构建信息8.1 命令行启动指定测试SamplesApp.cpp 支持两种命令行参数Samples alltests开启确定性校验mCheckDeterminism true并自动连跑全部测试跑完后退出mExitAfterRunningTests true适合自动化回归。Samples TestClassName按 RTTI 类名如LoadRigTest、FunnelTest直接启动对应测试跳过菜单选择。8.2 构建入口Samples 由 Samples.cmake 定义为add_executable(Samples ...)链接TestFramework、d3d12.lib、shcore.lib并将Samples设为 Visual Studio 启动项目、工作目录指向仓库根VS_DEBUGGER_WORKING_DIRECTORY。入口点为 SamplesApp.cpp 的ENTRY_POINT(SamplesApp)。程序主循环由Application基类驱动RenderFrame()L1650-L1905承担全部交互、录制/回放、确定性校验与固定步长物理更新mPhysicsSystem-Update(delta_time, mCollisionSteps, mIntegrationSubSteps, mTempAllocator, mJobSystem)见StepPhysics()L2058-L2112。9. 扩展阅读路径若希望深入 Samples 背后的测试框架建议顺藤摸瓜阅读以下仓库文件测试基类与生命周期 Tests/Test.hInitialize/PrePhysicsUpdate/PostPhysicsUpdate/CreateSettingsMenu/IsDeterministic等虚接口菜单与交互中枢SamplesApp.hEProbeMode、EShootObjectShape、播放模式枚举与全部成员默认值确定性验证与状态回放SamplesApp.cppSaveState/RestoreState/ValidateState载具约束的完整配置 VehicleConstraintTest.cpp 与 TankTest.cpp布娃娃与角色 KinematicRigTest.cpp、CharacterTest.cpp通过亲手运行 SamplesWindows 下按上文构建配合Run All Tests自动巡检与Mouse Probe逐项验证碰撞查询 API你将能快速建立对 Jolt Physics 各子系统行为的第一手认知这也正是官方将该程序作为提交前可视化回归工具的原因。赞分享游戏开发图形学【免费下载链接】PiccoloPiccolo (formerly Pilot) – mini game engine for games104项目地址https://gitcode.com/gh_mirrors/pi/Piccolo点击查看免费下载相关推荐4步让老Mac装上新版macOSOpenCore Legacy Patcher完整指南4步让老Mac装上新版macOSOpenCore Legacy Patcher完整指南 OpenCore Legacy Patcher 是一款免费开源工具专操作系统固件驱动开发网盘直链下载实测LinkSwift 九网盘直链解析助手使用与选型指南网盘直链下载实测LinkSwift 九网盘直链解析助手使用与选型指南 满格带宽网页却只给你几十 KB/s这类网盘下载慢的痛点靠网盘直链下载的思路能绕开网前端Unity Physics for DOTS 样例项目详解EntityComponentSystemSamples 中 PhysicsSamples 的场景指南、目录结构与实现剖析Unity Physics for DOTS 样例项目详解EntityComponentSystemSamples 中 PhysicsSamples 的场景指示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑