Three.js引入Cannon.js及使用示例詳解
引言
在開始之前,我們還是要解釋下什么是 Cannon.js 以及它的作用。
Cannon.js 是一個(gè) 3D 物理引擎,通過為物體賦予真實(shí)的物理屬性的方式來計(jì)算運(yùn)動(dòng)、旋轉(zhuǎn)和碰撞檢測(cè)。Cannon.js 相較于其他常見的物理引擎來說,比較輕量級(jí)而且完全通過 JavaScript 來實(shí)現(xiàn)。
Cannon.js 的官方文檔地址為 schteppe.github.io/cannon.js/ ,從官方介紹中也可以看到很多有趣的例子,如下所示:
本篇,我們就嘗試用 Three.js + Cannon.js 做一個(gè)簡(jiǎn)單的示例。
首先我們通過 Three.js 創(chuàng)建一個(gè)球及一個(gè)平面,前面已經(jīng)介紹過很多關(guān)于 Three.js 如何使用,這里就不多做介紹了
大體代碼及效果
const sphere = new THREE.Mesh( new THREE.SphereGeometry(1, 20, 20), new THREE.MeshStandardMaterial() ); scene.add(sphere); const floor = new THREE.Mesh( new THREE.PlaneGeometry(20, 20), new THREE.MeshStandardMaterial() ); floor.position.y = -5; floor.rotation.x = -Math.PI / 2; scene.add(floor);
在開始正式使用物理引擎之前,我們需要先弄清一些概念,Three.js 是渲染引擎,Cannon.js 是物理引擎。渲染引擎負(fù)責(zé)畫 UI,而物理引擎負(fù)責(zé)運(yùn)動(dòng)。
我們通過物理引擎打造一個(gè)和當(dāng)前 UI 一樣的世界,然后讓引擎運(yùn)動(dòng)起來,然后將運(yùn)動(dòng)物體的坐標(biāo)實(shí)時(shí)反映到渲染引擎中,這樣使得物理引擎和渲染引擎協(xié)同工作。
Cannon.js 打造當(dāng)前 UI
所以第一步,利用 Cannon.js 打造和當(dāng)前 UI 一樣的物理世界
import * as CANNON from "cannon-es"; // 創(chuàng)建物理世界 const world = new CANNON.World(); world.gravity.set(0, -9.8, 0); // 創(chuàng)建物理小球形狀 const sphereShape = new CANNON.Sphere(1); // 設(shè)置物體材質(zhì) const sphereWorldMaterial = new CANNON.Material(); // 創(chuàng)建物理世界的物體 const sphereBody = new CANNON.Body({ shape: sphereShape, // 位置 position: new CANNON.Vec3(0, 0, 0), // 小球質(zhì)量 mass: 1, // 物體材質(zhì) material: sphereWorldMaterial, }); // 將物體添加至物理世界 world.addBody(sphereBody); // 創(chuàng)建地面 const floorShape = new CANNON.Plane(); const floorBody = new CANNON.Body(); // 當(dāng)質(zhì)量為0時(shí),使得物體保持不動(dòng) floorBody.mass = 0; floorBody.addShape(floorShape); // 位置 floorBody.position.set(0, -5, 0); // 旋轉(zhuǎn) floorBody.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2); world.addBody(floorBody);
如此便打造了一個(gè)和 UI 一樣的物理世界,代碼很簡(jiǎn)單,相信通過注釋就能明白做了什么事情。
下面就是讓物理引擎“動(dòng)起來”,并將物體的坐標(biāo)同步賦值給渲染引擎中的物體。
從文檔中可以看到,step
就是我們想要的方法,利用 step
更新物理引擎世界的物體,隨后將 sphereBody
的 position
賦值給 Three.js 中的 sphere
。
const clock = new THREE.Clock(); function render() { // 更新物理引擎世界的物體 world.step(1 / 60, clock.getDelta()); sphere.position.copy(sphereBody.position); controls.update(); renderer.render(scene, camera); // 渲染下一幀的時(shí)候就會(huì)調(diào)用 render 函數(shù) requestAnimationFrame(render); } render();
如此便實(shí)現(xiàn)了 Three.js 和 Cannon.js 的聯(lián)動(dòng),最終效果如下圖所示:
以上就是Three.js引入Cannon.js及使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Three.js 引入Cannon.js的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
開發(fā)typescript項(xiàng)目tsconfig.json配置及選項(xiàng)使用解析
這篇文章主要為大家介紹了tsconfig.json配置及選項(xiàng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07TypeScript Module Resolution解析過程
這篇文章主要為大家介紹了TypeScript Module Resolution解析過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07TypeScript使用strictnullcheck實(shí)戰(zhàn)解析
這篇文章主要為大家介紹了TypeScript使用strictnullcheck實(shí)戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08TypeScript實(shí)現(xiàn)十大排序算法之冒泡排序示例詳解
這篇文章主要為大家介紹了TypeScript實(shí)現(xiàn)十大排序算法之冒泡排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02CKEditor4配置與開發(fā)詳細(xì)中文說明文檔
網(wǎng)上分享的CKEditor4中文說明很多都只是的部分使用方法,今天為大家分享一下比較完整的CKEditor4中文說明文檔2018-10-10TypeScript與JavaScript的區(qū)別分析
TypeScript可以使用JavaScript中的所有代碼和編程概念,TypeScript是為了使JavaScript的開發(fā)變得更加容易而創(chuàng)建的。推薦先精通JS的的前提下再學(xué)習(xí)TS,這樣更有利于同時(shí)學(xué)習(xí)兩門語言。2022-12-12詳解什么是TypeScript里的Constructor?signature
這篇文章主要介紹了什么是TypeScript里的Constructor?signature詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07TypeScript快速學(xué)習(xí)入門基礎(chǔ)語法
TypeScript的基礎(chǔ)語法,包括變量聲明、復(fù)合類型(數(shù)組和對(duì)象)、條件控制(if-else和switch)、循環(huán)(for和while)、函數(shù)(基礎(chǔ)和箭頭函數(shù),以及可選參數(shù))、面向?qū)ο筇匦裕杜e、接口、繼承)以及模塊開發(fā)中的導(dǎo)出和導(dǎo)入2024-07-07layui.layer彈出層(子頁面)改變父頁面內(nèi)容(訪問元素和函數(shù))
當(dāng)前頁面(父框架或父頁面)使用layer以iframe層的方式彈出新的窗口(子框架或子頁面)時(shí),如何在子頁面中訪問父頁面的元素和函數(shù),從而改變父元素的頁面顯示,給用戶合理舒適的體驗(yàn)。2023-02-02