You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中调用AddForceAtPosition时物体不应移动却产生移动问题

解决Unity中AddForceAtPosition导致物体额外移动的问题

嘿,咱们先搞明白为啥会出现这种情况:当你用AddForceAtPosition的时候,这个力会同时触发两个效果——一是不管作用点在哪,合外力都会让刚体产生线性平移;二是如果作用点偏离质心,会产生扭矩让物体旋转。你想要的只有旋转,所以得把线性移动的部分抵消掉才行。

方法一:抵消线性力分量

既然AddForceAtPosition施加的力会带来线性加速度,那我们可以在加偏移力的同时,给质心施加一个大小相等、方向相反的力,刚好把平移的效果抵消,只留下旋转扭矩。

修改后的代码是这样的:

// 计算要施加的推力向量(转成世界空间)
Vector3 thrustForce = transform.TransformDirection(Vector3.up * 5);
// 计算偏移后的作用点位置
Vector3 forcePosition = transform.position + transform.TransformDirection(mainThrustPt);

// 施加偏移力,让物体旋转
rb.AddForceAtPosition(thrustForce, forcePosition);
// 在质心施加反向力,抵消线性移动
rb.AddForce(-thrustForce, ForceMode.Force);

注意哦,这里的ForceMode要和你原代码保持一致,如果原代码用的是Impulse之类的模式,反向力也要用相同模式,才能精准抵消。

方法二:直接用AddTorque(更简洁)

要是你只是想要旋转效果,其实可以跳过AddForceAtPosition,直接计算扭矩然后用AddTorque——这种方式只会影响旋转,完全不会产生线性移动。扭矩的计算公式是扭矩 = 力臂 × 力(向量叉乘运算)。

代码示例:

// 力臂:从物体质心到作用点的局部偏移,转成世界空间向量
Vector3 leverArm = transform.TransformDirection(mainThrustPt);
// 推力向量(转成世界空间)
Vector3 thrustForce = transform.TransformDirection(Vector3.up * 5);
// 计算扭矩
Vector3 torque = Vector3.Cross(leverArm, thrustForce);
// 施加扭矩,让物体旋转
rb.AddTorque(torque, ForceMode.Force);

这种方法更直接,完全贴合你“只想要旋转力”的需求,不用考虑抵消的问题。

小提醒

  • 先确认你的刚体没有勾选IsKinematic,不然这些力的作用都不会生效;
  • 如果mainThrustPt是物体局部空间的偏移量,那transform.TransformDirection的用法是对的,能把它转换成世界空间的向量。

内容的提问来源于stack exchange,提问作者DjAndyC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:24:26