ThreeJs中使用Cannon实现方块自由落体效果

        之前有做过小球的掉落效果,不过那个从画面上只能看出来重力加速度和接触地面反弹的效果,可能没有那么直观,也许用一些js加物理公式也能实现类似的效果,这节用小方块来演示,可以很直观的看出物理世界的现象,因为方块是有棱角的,掉落的时候与地面接触是棱或者角的话就会弹开翻转再落地。        

        同样,我们先设置一个物理世界,在物理世界中放置一个方块和地面,并设置地面和方块之间的反弹恢复系数,同样在Threejs中使用boxGermory设置一个长方体,在渲染的时候保持此长方体和物理世界的小方块保持角度和位置一致,便于在画面上观察小方块的掉落效果。核心代码在下面了,如果自己尝试有问题可以留言向我要完整的源码。

initCarton(){
      //新建一个物理模型世界
      this.world = new CANNON.World();
      // 设置物理世界重力加速度,此处设置为y轴的反方向,也就是往y轴反方向存在重力
      this.world.gravity.set(0, -20, 0);

      // 新建一个物理小方块:对应threejs的网格小方块
      const boxMaterial = new CANNON.Material()
      this.box = new CANNON.Body({
        mass: 0.3,//碰撞体质量
        material: boxMaterial,//设置小方块的材质
        shape:new CANNON.Box(new CANNON.Vec3(15, 6, 15)),//设置方形大小
      });
      this.box.position.y = 100;//设置小方块的位置
      this.box.quaternion.setFromEuler(Math.PI / 3, Math.PI / 3, Math.PI / 3);
      this.world.addBody(this.box);//将小方块添加到物理世界中

      // 新建物理地面
      const groundMaterial = new CANNON.Material()
      const groundBody = new CANNON.Body({
        mass: 0, // 质量为0,始终保持静止,不会受到力碰撞或加速度影响
        shape:new CANNON.Plane(),//新建物理模型的底面
        material: groundMaterial,//地面材质
      });
      // 改变平面默认的方向,法线默认沿着z轴,旋转到平面向上朝着y方向
      groundBody.quaternion.setFromEuler(-Math.PI / 2, 0, 0);
      this.world.addBody(groundBody);

      // 设置地面材质和小方块材质之间的碰撞反弹恢复系数,也就是底面和小方块的材质之间存在的反弹系数,
      const contactMaterial = new CANNON.ContactMaterial(groundMaterial, boxMaterial, {
        restitution: 0.2 //反弹恢复系数
      })
      // 把关联的材质添加到物理世界中
      this.world.addContactMaterial(contactMaterial)

      // 实体模型的网格小方块,这里是用来对应显示物理模型下的小方块位置
      const geometry = new THREE.BoxGeometry(15,6, 15);
      const material = new THREE.MeshLambertMaterial({
        color: 0x00ffff,
      });
      this.boxmesh = new THREE.Mesh(geometry, material);
      this.boxmesh.position.y = 100;
      this.boxmesh.rotation.set(Math.PI / 3, Math.PI / 3, Math.PI / 3);
      this.scene.add(this.boxmesh)

      //实体地面的网格模型,这里用来显示对应物理对应的地面
      const planeGeometry = new THREE.PlaneGeometry(200, 200);
      const planeMaterial = new THREE.MeshLambertMaterial({
        color:0x777777,
      });
      const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial);
      planeMesh.rotateX(-Math.PI / 2);
      this.scene.add(planeMesh)
    },

效果视频:

小方块自由落体

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
three.js是一个用于创建3D图形的JavaScript库。它提供了丰富的功能和工具,可以轻松地在Web浏览器创建交互式的3D场景和动画效果自由落体是物理学的一个概念,指的是一个物体在没有外力作用下自由下落的过程。在three.js实现自由落体可以通过以下步骤: 1. 创建场景(Scene):使用`new THREE.Scene()`创建一个场景对象,用于存放所有的3D元素。 2. 创建相机(Camera):使用`new THREE.PerspectiveCamera()`创建一个透视相机对象,用于观察场景。 3. 创建渲染器(Renderer):使用`new THREE.WebGLRenderer()`创建一个WebGL渲染器对象,用于将场景渲染到浏览器。 4. 创建物体(Object):使用`new THREE.Mesh()`创建一个网格对象,可以表示一个物体。可以设置物体的几何形状、材质等属性。 5. 添加物体到场景:使用`scene.add(object)`将物体添加到场景。 6. 更新物体位置:在每一帧,更新物体的位置,模拟自由落体的过程。可以使用物理引擎库如cannon.js来计算物体的运动轨迹。 7. 渲染场景:使用渲染器的`render(scene, camera)`方法将场景渲染到浏览器。 下面是一个简单的示例代码,实现了一个球体的自由落体效果: ```javascript // 创建场景 var scene = new THREE.Scene(); // 创建相机 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; // 创建渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建球体 var geometry = new THREE.SphereGeometry(1, 32, 32); var material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); var sphere = new THREE.Mesh(geometry, material); // 添加球体到场景 scene.add(sphere); // 更新物体位置 function update() { // 模拟自由落体过程,更新球体的位置 sphere.position.y -= 0.1; // 请求下一帧更新 requestAnimationFrame(update); } // 渲染场景 function render() { renderer.render(scene, camera); } // 开始动画循环 function animate() { update(); render(); } animate(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baker_zhuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值