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

Rapier JS+Three.js辊筒输送机仿真异常速度问题求助

辊筒输送机Rapier JS(搭配Three.js)仿真问题

我用Rapier JS结合Three.js开发辊筒输送机系统仿真,核心实现代码如下:

辊筒对象创建

roller = {
    visible: roller_sequence.visible,
    enable: "enable",
    speed: "speed",
    acceleration: "accel",
    speed_feedback: 0,
    current_speed: "p " + position_number + " current speed",
    position_number: position_number,
    length: roller_sequence.length,
    radius: 0.025,
    local_position: new THREE.Vector3(position.x, position.y, position.z),
    local_rotation: new THREE.Quaternion(rotation.x, rotation.y, rotation.z, rotation.w),
    position: new THREE.Vector3(absolute.position.x, absolute.position.y, absolute.position.z),
    rotation: new THREE.Quaternion(absolute.rotation.x, absolute.rotation.y, absolute.rotation.z, absolute.rotation.w),
    parent: roller_sequence.parent
}

let rigidBodyDesc = RAPIER.RigidBodyDesc.kinematicPositionBased()
    .setTranslation(roller.position.x, roller.position.y, roller.position.z)
    .setRotation(new emulation.physics.Rapier.Quaternion(roller.rotation.x, roller.rotation.y, roller.rotation.z, roller.rotation.w))
let rigid_body = world.createRigidBody(rigidBodyDesc);
let colliderDesc = RAPIER.ColliderDesc.cylinder((roller.length*0.42)/2, roller.radius)
    .setFriction(2)
    .setRestitution(0)
let collider = world.createCollider(colliderDesc, rigid_body);

roller.rigid_body = rigid_body
roller.collider  = collider;
roller.kinematic = true;

rollers.push(roller)

圆角长方体箱子创建

const quat = new THREE.Quaternion();
quat.setFromAxisAngle(new THREE.Vector3(0,1,0),(load.angle+90)*(Math.PI/180));

let rigidBodyDesc       = RAPIER.RigidBodyDesc.dynamic()
    .setTranslation(load_position.x, load_position.y, load_position.z)
    .setRotation(new RAPIER.Quaternion(quat.x, quat.y, quat.z, quat.w))
    //.setAngularDamping(1)
    //.setLinearDamping(1)
let rigidBody           = world.createRigidBody(rigidBodyDesc);
let colliderDesc        = RAPIER.ColliderDesc.roundCuboid((load_size.x/2)-0.02, (load_size.y/2)-0.02, (load_size.z/2)-0.02, 0.02)
    .setMass(1)
    //.setRestitution(0)
    //.setFriction(1)
let tote_collider       = world.createCollider(colliderDesc, rigidBody);
load.userData.collider  = tote_collider;
load.userData.dynamic   = true;

load.quaternion.copy(tote_collider.rotation())

辊筒旋转控制

仿真中通过以下代码控制辊筒沿轴旋转:

roller.rigid_body.setNextKinematicRotation(new RAPIER.Quaternion(roller.rotation.x, roller.rotation.y, roller.rotation.z, roller.rotation.w))

遇到的问题

  • 仅调用仿真步进代码时,辊筒会猛烈甩出箱子
  • 为每个辊筒调用setNextKinematicRotation传入新旋转值时,箱子先前进,随后出现停止、后退或抖动,运行不稳定,偶尔正常
  • 重复为每个辊筒传入相同旋转值调用setNextKinematicRotation时,箱子保持静止,符合预期
  • 不按帧率缩放速度时,抖动现象消失,但静止辊筒甩箱的问题仍存在

疑问

无法理解静止辊筒为何会产生甩出箱子的力,也不清楚所有辊筒同速时箱子出现异常进退/抖动的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:58