Three结合Ammo.js初尝试物体碰撞下落物理效果

您所在的位置:网站首页 3dmax物体渐渐消失了 Three结合Ammo.js初尝试物体碰撞下落物理效果

Three结合Ammo.js初尝试物体碰撞下落物理效果

2023-01-31 16:12| 来源: 网络整理| 查看: 265

请添加图片描述

代码仓库 https://gitee.com/honbingitee/three-template-next.js/tree/feature/physics 在线地址: http://three.hongbin.xyz/three/physics

主要Ammo的使用步骤

创建Ammo变量每个需要物理效果的物体设置对应在ammo中的数据执行ammostepSimulation步骤模拟 更新物体位置

创建变量

function initPhysicsVariable(Ammo: any) { transformAux1 = new Ammo.btTransform(); // bullet基本场景配置 collisionConfiguration = new Ammo.btDefaultCollisionConfiguration(); dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration); broadphase = new Ammo.btDbvtBroadphase(); solver = new Ammo.btSequentialImpulseConstraintSolver(); physicsWorld = new Ammo.btDiscreteDynamicsWorld( dispatcher, broadphase, solver, collisionConfiguration ); physicsWorld.setGravity(new Ammo.btVector3(0, gravityConstant, 0)); }

根据物体的位置、旋转信息 生成对应ammo的运算数据

function createRigidBody( Ammo: any, mesh: Object3D, physicsShape: any, mass: number ) { const pos = mesh.position; const quat = mesh.quaternion; var transform = new Ammo.btTransform(); transform.setIdentity(); transform.setOrigin(new Ammo.btVector3(pos.x, pos.y, pos.z)); transform.setRotation( new Ammo.btQuaternion(quat.x, quat.y, quat.z, quat.w) ); var motionState = new Ammo.btDefaultMotionState(transform); var localInertia = new Ammo.btVector3(0, 0, 0); physicsShape.calculateLocalInertia(mass, localInertia); var rbInfo = new Ammo.btRigidBodyConstructionInfo( mass, motionState, physicsShape, localInertia ); var body = new Ammo.btRigidBody(rbInfo); mesh.userData.physicsBody = body; if (mass > 0) { rigidBodies.push(mesh); // Disable deactivation // 防止物体弹力过快消失 // Ammo.DISABLE_DEACTIVATION = 4 body.setActivationState(4); } physicsWorld.addRigidBody(body); return body; }

计算变化 更新视图

function updatePhysics(deltaTime: number) { physicsWorld.stepSimulation(deltaTime); const { length } = rigidBodies; // 更新物体位置 for (var i = 0; i ms.getWorldTransform(transformAux1); var p = transformAux1.getOrigin(); var q = transformAux1.getRotation(); objThree.position.set(p.x(), p.y(), p.z()); objThree.quaternion.set(q.x(), q.y(), q.z(), q.w()); } } }

详细代码可参考上文代码仓库地址或three官方案例



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3