01 - Cannon.js 引擎的用途和基本使用

Published 2025-07-24 00:18 975 words 5 min read

做产品前,先别急着写代码:我是怎么判断一个点子值不值得做的想偷卷?但微信不支持md文档?这个软件助你!新手小白如何开发练手项目?前端常见安全问题 + 防御方法 + 面试回答吉比特(雷霆游戏)前端二面问题总结吉比特27前端实习面试纷享销客前端实习一面08-刚体约束 Constraint07-监听碰撞事件和获取碰撞信息06 - 物体休眠与休眠事件详解(Cannon.js)05-碰撞与碰撞组04 - 弹性与接触材质详解03 - Cannon 材质与摩擦系数设置02 - Cannon 引擎基础碰撞讲解01 - Cannon.js 引擎的用途和基本使用一款减轻前端图片命名工作量的图片转换器总结:一个双非大学生的两年,是怎么过来的?数学公式Input-输入框组件实现详解用HTML5实现实时ASCII艺术摄像头object-fit: contain - CSS 属性详解GSAP (GreenSock Animation Platform) 动画库学习指南Webview通信系统学习指南实现手势操控3D粒子动画?太好玩了!东田数码科技前端面试前端性能优化面试回答技巧(一)React与Vue表单的对比差异融山科技前端面经·React的入门学习(一)九方前端面试JavaScript 核心:数组/字符串 API 精要指南JavaScript的常用数组API原理解析前端练习小网站-新手突破之路前端の骚操作代码合集 (二)| 让你的网页变得有趣前端Threejs入门(五)Vue 3 响应式原理:computed的模板解包机制Vue 监听器 watch 深度解析Axios 深入解析从0到1配置vue项目跟git仓库连接!前端Three.js入门(四)你懂keep-alive吗?见过Vue的小区保安吗?前端Three.js入门(三)前端Three.js入门(二)前端Three.js入门(一)-Three的第一个简单的页面 Git 大冒险:解锁代码管理的秘密武器如何将网站加载速度提升50%?前端性能优化全攻略前端の骚操作代码合集 | 让你的网页充满恶趣味进击蓝桥杯!2025web前端HTML5uniapp-页面生命周期
This post is not yet available in English. Showing the original.
01 Cannon.js 引擎的用途和基本使用 作者: 前端AC | 原文: https://juejin.cn/post/7530106154313400330 01 Cannon.js 引擎的用途和基本使用 前言 朱波想做游戏,前来学习这个cannon物理引擎,太好用了。 Canno...

01 - Cannon.js 引擎的用途和基本使用

作者: 前端AC | 原文: https://juejin.cn/post/7530106154313400330

01 - Cannon.js 引擎的用途和基本使用

前言

朱波想做游戏,前来学习这个cannon物理引擎,太好用了。

Cannon.js 是什么?

Cannon.js 是一个轻量级的 JavaScript 物理引擎,适用于 Web 应用和游戏开发。它专注于刚体物理模拟,能高效地处理物体间的碰撞、力学反应、摩擦等物理效果。

适用于 Three.js 等 WebGL 引擎配合使用,增强场景的真实物理行为。


Cannon.js 的用途

  • 游戏开发中的物理碰撞检测与响应
  • Web3D 场景中的物体重力、摩擦模拟
  • 拖拽物体、堆叠、刚体运动模拟
  • 教育和科学可视化中的物理实验

安装 Cannon.js

推荐使用 cannon-es(是 Cannon.js 的现代 ES module 重构版,维护活跃)

npm install cannon-es

如果你使用 Vue3 + Vite,安装完成后就可以像普通模块一样导入:

import * as CANNON from 'cannon-es'

Vue3 示例:球体因重力下落

我们来展示一个最简物理模拟示例:

  • 一个球体在空中受到重力影响下落
  • 不设置地面,不发生碰撞,仅用于演示重力作用
<script setup>
// 引入必要模块
import { onMounted, ref } from 'vue'
import * as THREE from 'three'
import * as CANNON from 'cannon-es'

// 创建 canvas 引用
const canvasRef = ref()

onMounted(() => {
  // 初始化 Three.js 场景
  const scene = new THREE.Scene()

  // 创建相机并设置位置
  const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
  camera.position.set(0, 5, 15)

  // 创建渲染器并绑定 canvas
  const renderer = new THREE.WebGLRenderer({ canvas: canvasRef.value })
  renderer.setSize(window.innerWidth, window.innerHeight)

  // 创建球体的几何体和材质,并生成 mesh
  const sphereGeometry = new THREE.SphereGeometry(1)
  const sphereMaterial = new THREE.MeshStandardMaterial({ color: 0x0077ff })
  const sphereMesh = new THREE.Mesh(sphereGeometry, sphereMaterial)
  scene.add(sphereMesh)

  // 添加半球光照,增强视觉效果
  const light = new THREE.HemisphereLight(0xffffff, 0x444444, 1.2)
  light.position.set(0, 20, 0)
  scene.add(light)

  // 初始化 Cannon.js 世界
  const world = new CANNON.World()
  world.gravity.set(0, -9.82, 0) // 设置重力加速度,单位 m/s²

  // 创建一个球体刚体,初始位置在 y=10
  const ballBody = new CANNON.Body({
    mass: 1, // 质量为 1,表示会受到重力影响
    shape: new CANNON.Sphere(1), // 与 Three.js 中的球体对应
    position: new CANNON.Vec3(0, 10, 0),
  })
  world.addBody(ballBody)

  // 创建时间步长与时钟
  const clock = new THREE.Clock()
  const step = 1 / 60

  // 动画更新函数
  function animate() {
    requestAnimationFrame(animate) // 循环调用动画帧

    const delta = clock.getDelta() // 获取自上一帧的时间差
    world.step(step, delta) // 推进物理世界一步

    // 同步物理刚体位置到 Three.js mesh
    sphereMesh.position.copy(ballBody.position)

    // 渲染场景
    renderer.render(scene, camera)
  }

  animate() // 启动动画循环
})
</script>

<template>
  <!-- 渲染用 canvas 元素 -->
  <canvas ref="canvasRef"></canvas>
</template>

2025-07-23T10_15_23.407Z-25720.gif
2025-07-23T10_15_23.407Z-25720.gif

部分代码解释:

参数含义示例值解释
75视野角度(FOV)75像人眼视角那样,角度越大视野越广,但会有畸变
window.innerWidth / window.innerHeight长宽比比如 16:9防止画面拉伸或压缩,使用窗口的实际比例
0.1近裁剪面0.1相机能“看到”的最近距离,太小会有深度精度问题
1000远裁剪面1000相机能“看到”的最远距离,超过这个距离的物体不会被渲染
行号代码解释
const renderer = new THREE.WebGLRenderer({ canvas: canvasRef.value });创建一个 WebGL 渲染器(Renderer)实例,并将其渲染目标绑定到 Vue 模板中的 <canvas> 元素上。这样,Three.js 渲染结果会直接显示在页面上的这个 canvas 中。
renderer.setSize(window.innerWidth, window.innerHeight);设置渲染器的宽度和高度为浏览器窗口的尺寸,使画布充满整个屏幕,避免图像变形或只显示一部分。

小结

  • Cannon.js 用于模拟真实物理行为:重力、碰撞、摩擦等
  • 推荐使用 cannon-es 模块,结合 Vue3 和 Three.js 渲染效果
  • 该示例展示了最基本的重力作用:球体自然下落