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

物理模拟中如何沿物体自身角度平移?基于Matter.js的计算问题

Matter.js 刚体沿自身朝向平移解决方案

核心计算逻辑

2D平面内沿指定角度平移的坐标换算规则非常明确:

  • 沿角度方向平移的x轴位移分量:dx = 平移距离 * cos(刚体当前弧度角)
  • 沿角度方向平移的y轴位移分量:dy = 平移距离 * sin(刚体当前弧度角)

注意:Matter.js内置Body.angle属性默认使用弧度制,逆时针旋转为正方向,0角度对应x轴正方向(朝右),无需额外做角度单位转换。
你提到的旋转45度场景对应弧度为Math.PI / 4,代入40单位的平移距离计算可得dx≈28.28、dy≈28.28,刚好符合沿45度方向平移40单位的预期。

代码实现

方式1:瞬间完成平移

直接修改刚体坐标即可,适合无动画需求的场景:

// squareBody 为你的正方形刚体实例
const moveDistance = 40;
const dx = moveDistance * Math.cos(squareBody.angle);
const dy = moveDistance * Math.sin(squareBody.angle);
Matter.Body.setPosition(squareBody, {
  x: squareBody.position.x + dx,
  y: squareBody.position.y + dy
});

方式2:平滑移动

通过设置速度实现匀速平移,适合需要动画效果的场景:

const moveDistance = 40;
const moveDuration = 1000; // 平移总耗时,单位ms,可自行调整
// 计算每帧需要的速度,默认60帧/s
const velocityX = (moveDistance * Math.cos(squareBody.angle)) / (moveDuration / 1000 * 60);
const velocityY = (moveDistance * Math.sin(squareBody.angle)) / (moveDuration / 1000 * 60);
Matter.Body.setVelocity(squareBody, {x: velocityX, y: velocityY});
// 到达目标位置后停止移动
setTimeout(() => {
  Matter.Body.setVelocity(squareBody, {x: 0, y: 0});
}, moveDuration);

内容的提问来源于stack exchange,提问作者Dr. Chocolate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:24:03