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
相关产品推荐
相关产品推荐

