[{"data":1,"prerenderedAt":401},["ShallowReactive",2],{"navigation":3,"/api/rigid-body/contact-force":72,"/api/rigid-body/contact-force-surround":396},[4,22],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","/getting-started","1.getting-started/1.index",[9,10,14,18],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation Guide","/getting-started/installation","1.getting-started/2.installation",{"title":15,"path":16,"stem":17},"Usage","/getting-started/usage","1.getting-started/3.usage",{"title":19,"path":20,"stem":21},"How it works","/getting-started/how-it-works","1.getting-started/how-it-works",{"title":23,"path":24,"stem":25,"children":26},"Api","/api","2.api",[27,30,64,68],{"title":28,"path":24,"stem":29},"Physics","2.api/index",{"title":31,"path":32,"stem":33,"children":34},"Rigid body","/api/rigid-body","2.api/1.rigid-body/index",[35,36,40,44,48,52,56,60],{"title":31,"path":32,"stem":33},{"title":37,"path":38,"stem":39},"Automatic colliders","/api/rigid-body/automatic-colliders","2.api/1.rigid-body/1.automatic-colliders",{"title":41,"path":42,"stem":43},"Custom colliders","/api/rigid-body/custom-colliders","2.api/1.rigid-body/2.custom-colliders",{"title":45,"path":46,"stem":47},"Forces","/api/rigid-body/forces","2.api/1.rigid-body/3.forces",{"title":49,"path":50,"stem":51},"Collisions","/api/rigid-body/collisions","2.api/1.rigid-body/4.collisions",{"title":53,"path":54,"stem":55},"Sensor","/api/rigid-body/sensor","2.api/1.rigid-body/5.sensor",{"title":57,"path":58,"stem":59},"Contact force","/api/rigid-body/contact-force","2.api/1.rigid-body/6.contact-force",{"title":61,"path":62,"stem":63},"Instance rigid body","/api/rigid-body/instance-rigid-body","2.api/1.rigid-body/7.instance-rigid-body",{"title":65,"path":66,"stem":67},"Joints","/api/joint","2.api/2.joint",{"title":69,"path":70,"stem":71},"UseRapier","/api/use-rapier","2.api/3.use-rapier",{"id":73,"title":57,"body":74,"description":389,"extension":390,"links":391,"meta":392,"navigation":393,"path":58,"seo":394,"stem":59,"__hash__":395},"docs/2.api/1.rigid-body/6.contact-force.md",{"type":75,"value":76,"toc":383},"minimark",[77,83,92,190,200,207,217,310,314,325,332,379],[78,79,80],"scene-wrapper",{},[81,82],"demos-contact-force",{},[84,85,86,87,91],"p",{},"Contact force events are triggered after the physics solver computes forces between two colliders. Unlike ",[88,89,90],"a",{"href":50},"collisions",", contact force events don't fire on enter/exit — they fire every simulation step while two bodies remain in contact and the accumulated force exceeds a configurable threshold.",[93,94,99],"pre",{"className":95,"code":96,"language":97,"meta":98,"style":98},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CRigidBody activeContactForce @contact-force=\"onContactForce\">\n  \u003CTresMesh>\n    \u003CTresSphereGeometry />\n    \u003CTresMeshNormalMaterial />\n  \u003C/TresMesh>\n\u003C/RigidBody>\n","html","",[100,101,102,137,148,160,170,180],"code",{"__ignoreMap":98},[103,104,107,111,115,119,122,125,128,132,134],"span",{"class":105,"line":106},"line",1,[103,108,110],{"class":109},"sMK4o","\u003C",[103,112,114],{"class":113},"swJcz","RigidBody",[103,116,118],{"class":117},"spNyl"," activeContactForce",[103,120,121],{"class":117}," @contact-force",[103,123,124],{"class":109},"=",[103,126,127],{"class":109},"\"",[103,129,131],{"class":130},"sfazB","onContactForce",[103,133,127],{"class":109},[103,135,136],{"class":109},">\n",[103,138,140,143,146],{"class":105,"line":139},2,[103,141,142],{"class":109},"  \u003C",[103,144,145],{"class":113},"TresMesh",[103,147,136],{"class":109},[103,149,151,154,157],{"class":105,"line":150},3,[103,152,153],{"class":109},"    \u003C",[103,155,156],{"class":113},"TresSphereGeometry",[103,158,159],{"class":109}," />\n",[103,161,163,165,168],{"class":105,"line":162},4,[103,164,153],{"class":109},[103,166,167],{"class":113},"TresMeshNormalMaterial",[103,169,159],{"class":109},[103,171,173,176,178],{"class":105,"line":172},5,[103,174,175],{"class":109},"  \u003C/",[103,177,145],{"class":113},[103,179,136],{"class":109},[103,181,183,186,188],{"class":105,"line":182},6,[103,184,185],{"class":109},"\u003C/",[103,187,114],{"class":113},[103,189,136],{"class":109},[191,192,193],"prose-note",{},[84,194,195,196,199],{},"You need to set the ",[100,197,198],{},"activeContactForce"," prop to receive contact force events.",[201,202,204],"h2",{"id":203},"contactforceeventthreshold",[100,205,206],{},"contactForceEventThreshold",[84,208,209,210,212,213,216],{},"Because contact force events fire every simulation step, it's often useful to filter out low-force contacts. Set ",[100,211,206],{}," to only receive events when the total force magnitude exceeds the given value (defaults to ",[100,214,215],{},"5.0",").",[93,218,220],{"className":95,"code":219,"language":97,"meta":98,"style":98},"\u003CRigidBody\n  activeContactForce\n  :contact-force-event-threshold=\"100\"\n  @contact-force=\"onContactForce\"\n>\n  \u003CTresMesh>\n    \u003CTresSphereGeometry />\n    \u003CTresMeshNormalMaterial />\n  \u003C/TresMesh>\n\u003C/RigidBody>\n",[100,221,222,229,234,249,262,266,274,283,292,301],{"__ignoreMap":98},[103,223,224,226],{"class":105,"line":106},[103,225,110],{"class":109},[103,227,228],{"class":113},"RigidBody\n",[103,230,231],{"class":105,"line":139},[103,232,233],{"class":117},"  activeContactForce\n",[103,235,236,239,241,243,246],{"class":105,"line":150},[103,237,238],{"class":117},"  :contact-force-event-threshold",[103,240,124],{"class":109},[103,242,127],{"class":109},[103,244,245],{"class":130},"100",[103,247,248],{"class":109},"\"\n",[103,250,251,254,256,258,260],{"class":105,"line":162},[103,252,253],{"class":117},"  @contact-force",[103,255,124],{"class":109},[103,257,127],{"class":109},[103,259,131],{"class":130},[103,261,248],{"class":109},[103,263,264],{"class":105,"line":172},[103,265,136],{"class":109},[103,267,268,270,272],{"class":105,"line":182},[103,269,142],{"class":109},[103,271,145],{"class":113},[103,273,136],{"class":109},[103,275,277,279,281],{"class":105,"line":276},7,[103,278,153],{"class":109},[103,280,156],{"class":113},[103,282,159],{"class":109},[103,284,286,288,290],{"class":105,"line":285},8,[103,287,153],{"class":109},[103,289,167],{"class":113},[103,291,159],{"class":109},[103,293,295,297,299],{"class":105,"line":294},9,[103,296,175],{"class":109},[103,298,145],{"class":113},[103,300,136],{"class":109},[103,302,304,306,308],{"class":105,"line":303},10,[103,305,185],{"class":109},[103,307,114],{"class":113},[103,309,136],{"class":109},[201,311,313],{"id":312},"events","Events",[315,316,317],"field-group",{},[318,319,322],"field",{"name":320,"type":321},"contact-force","(payload: ContactForcePayload) => void",[84,323,324],{},"Triggered every simulation step while two colliders are in contact and the force exceeds the threshold.",[326,327,329],"h3",{"id":328},"contactforcepayload",[100,330,331],{},"ContactForcePayload",[315,333,334,344,350,357,367,373],{},[318,335,338],{"name":336,"type":337},"source","SourceTarget",[84,339,340,341,343],{},"The rigid body and collider that has ",[100,342,198],{}," enabled.",[318,345,347],{"name":346,"type":337},"target",[84,348,349],{},"The other rigid body and collider involved in the contact.",[318,351,354],{"name":352,"type":353},"totalForce","Vector",[84,355,356],{},"The sum of all contact forces between the two colliders, as a 3D vector.",[318,358,361],{"name":359,"type":360},"totalForceMagnitude","number",[84,362,363,364,366],{},"The scalar magnitude of ",[100,365,352],{},".",[318,368,370],{"name":369,"type":353},"maxForceDirection",[84,371,372],{},"The direction of the largest individual contact force.",[318,374,376],{"name":375,"type":360},"maxForceMagnitude",[84,377,378],{},"The magnitude of the largest individual contact force.",[380,381,382],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":98,"searchDepth":106,"depth":139,"links":384},[385,386],{"id":203,"depth":139,"text":206},{"id":312,"depth":139,"text":313,"children":387},[388],{"id":328,"depth":150,"text":331},"Monitor and react to contact forces applied to rigid bodies during collisions.","md",null,{},true,{"title":57,"description":389},"ecsx0IMkuWxpEozzdoxAiJjek7tCUEo9gHYdMObcORI",[397,399],{"title":53,"path":54,"stem":55,"description":398,"children":-1},"Use sensor colliders to detect when objects enter or exit a region without generating physical contact responses.",{"title":61,"path":62,"stem":63,"description":400,"children":-1},"Simulate many repeated objects efficiently by creating one Rapier rigid body per instance of a TresInstancedMesh.",1781680040530]