欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Three.js物理引擎Cannon.js創(chuàng)建簡單應用程序

 更新時間:2023年04月24日 15:12:08   作者:Data_Adventure  
這篇文章主要為大家介紹了Three.js物理引擎Cannon.js創(chuàng)建簡單應用程序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

Three.js 和 Cannon.js 是兩個非常流行的 JavaScript 庫,用于創(chuàng)建 3D 游戲和交互式應用程序。Three.js 是一個用于創(chuàng)建 3D 圖形的庫,而 Cannon.js 是一個用于物理模擬的庫。在本文中,我們將探討如何使用這兩個庫來創(chuàng)建一個簡單的物理模擬應用程序。

在 HTML 文件中引入 Three.js 和 Cannon.js 庫

首先,我們需要在 HTML 文件中引入 Three.js 和 Cannon.js 庫。我們可以使用以下代碼:

<script src="https://cdn.jsdelivr.net/npm/three@0.131.2/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/cannon@0.6.2/build/cannon.min.js"></script>

接下來,我們需要創(chuàng)建一個 Three.js 場景和一個 Cannon.js 物理世界。我們可以使用以下代碼:

// 創(chuàng)建 Three.js 場景
const scene = new THREE.Scene();
// 創(chuàng)建 Cannon.js 物理世界
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0);

創(chuàng)建一些 Three.js 對象并將它們添加到場景中

現(xiàn)在,我們可以創(chuàng)建一些 Three.js 對象并將它們添加到場景中。

例如,我們可以創(chuàng)建一個立方體并將其添加到場景中:

// 創(chuàng)建一個立方體
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
// 將立方體添加到場景中
scene.add(cube);

創(chuàng)建一個 Cannon.js 物體

接下來,我們需要創(chuàng)建一個 Cannon.js 物體,并將其與 Three.js 對象關聯(lián)起來。

我們可以使用以下代碼:

// 創(chuàng)建 Cannon.js 物體
const shape = new CANNON.Box(new CANNON.Vec3(0.5, 0.5, 0.5));
const body = new CANNON.Body({ mass: 1 });
body.addShape(shape);
// 將 Cannon.js 物體與 Three.js 對象關聯(lián)起來
const cubeBody = new THREE.Object3D();
cubeBody.position.copy(cube.position);
scene.add(cubeBody);
world.addBody(body);

在每一幀更新 Three.js 對象的位置

現(xiàn)在,我們可以在每一幀更新 Three.js 對象的位置,以反映 Cannon.js 物理世界中的物體運動。

我們可以使用以下代碼:

function animate() {
  requestAnimationFrame(animate);
  // 更新 Cannon.js 物理世界
  world.step(1 / 60);
  // 更新 Three.js 對象的位置
  cube.position.copy(body.position);
  cube.quaternion.copy(body.quaternion);
  // 渲染場景
  renderer.render(scene, camera);
}
animate();

現(xiàn)在,我們已經成功地創(chuàng)建了一個簡單的物理模擬應用程序,使用了 Three.js 和 Cannon.js 庫。我們可以通過添加更多的 Three.js 對象和 Cannon.js 物體來擴展這個應用程序,以創(chuàng)建更復雜的物理模擬場景。

完整的示例

下面是一個完整的示例,一個紅色小球從高空跌落,3秒鐘出現(xiàn)一個。

// 創(chuàng)建場景、相機和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 100000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.set(0, 15, 25)
scene.fog = new THREE.Fog(0xffffff, 0, 500);
// 創(chuàng)建 Cannon.js 物理世界
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0);
// 創(chuàng)建地面
const groundShape = new CANNON.Plane();
const groundBody = new CANNON.Body({ mass: 0 });
groundBody.addShape(groundShape);
groundBody.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2);
// 將地面添加到場景中
const groundMaterial = new THREE.MeshBasicMaterial({ color: 0x999999 });
const groundGeometry = new THREE.PlaneGeometry(10000, 10000);
const ground = new THREE.Mesh(groundGeometry, groundMaterial);
ground.rotation.x = -Math.PI / 2;
scene.add(ground);
// 將 Cannon.js 物體與 Three.js 對象關聯(lián)起來
const groundBodyMesh = new THREE.Object3D();
groundBodyMesh.position.copy(ground.position);
scene.add(groundBodyMesh);
world.addBody(groundBody);
// 燈光
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(0, 20, 10);
scene.add(light);
// 半球光
const light2 = new THREE.HemisphereLight(0xffffbb, 0x080820, 1);
scene.add(light2);
new THREE.OrbitControls(camera, renderer.domElement);
function createBall() {
  // 創(chuàng)建小球
  const radius = 5;
  const segments = 32;
  const geometry = new THREE.SphereGeometry(radius, segments, segments);
  // phhong材質
  const material = new THREE.MeshPhongMaterial({ color: 0xff0000 });
  const ball = new THREE.Mesh(geometry, material);
  // 設置小球的初始位置
  // x z 位置隨機
  const x = Math.random() * 4 - 2;
  const z = Math.random() * 4 - 2;
  ball.position.set(x, 25, z);
  // 將小球添加到場景中
  scene.add(ball);
  // 創(chuàng)建 Cannon.js 物體
  const shape = new CANNON.Sphere(radius);
  const body = new CANNON.Body({ mass: 1 });
  body.addShape(shape);
  // 設置小球的初始位置和速度
  body.position.set(x, 25, z);
  body.velocity.set(0, -9.82, 0);
  // 將 Cannon.js 物體與 Three.js 對象關聯(lián)起來
  const ballBody = new THREE.Object3D();
  ballBody.position.copy(ball.position);
  scene.add(ballBody);
  world.addBody(body);
  function animateBall() {
    // 更新 Cannon.js 物理世界
    world.step(1 / 60);
    // 更新 Three.js 對象的位置
    ball.position.copy(body.position);
    ball.quaternion.copy(body.quaternion);
    if (body.position.y < 0) {
      scene.remove(ball);
      world.removeBody(body);
      clearInterval(intervalId);
    }
    renderer.render(scene, camera);
  }
  const intervalId = setInterval(animateBall, 1000 / 60);
}
createBall();
setInterval(createBall, 3000);
function animate() {
  requestAnimationFrame(animate);
  renderer.render(scene, camera);
}
animate();

以上就是Three.js物理引擎Cannon.js創(chuàng)建簡單應用程序的詳細內容,更多關于Three.js物理引擎Cannon.js的資料請關注腳本之家其它相關文章!

相關文章

  • element-ui?對話框dialog使用echarts報錯'dom沒有獲取到'的問題

    element-ui?對話框dialog使用echarts報錯'dom沒有獲取到'的問題

    這篇文章主要介紹了element-ui?對話框dialog里使用echarts,報錯'dom沒有獲取到'的問題,在這個事件里邊進行echarts的初始化,執(zhí)行數(shù)據,本文結合實例代碼給大家詳細講解,需要的朋友可以參考下
    2022-11-11
  • 用js查找法實現(xiàn)當前欄目的高亮顯示的代碼

    用js查找法實現(xiàn)當前欄目的高亮顯示的代碼

    本文給大家介紹了使用js查找法實現(xiàn)當前欄目的高亮顯示的代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2007-11-11
  • js實現(xiàn)同一頁面可多次調用的圖片幻燈切換效果

    js實現(xiàn)同一頁面可多次調用的圖片幻燈切換效果

    這篇文章主要介紹了js實現(xiàn)同一頁面可多次調用的圖片幻燈切換效果,可實現(xiàn)在同一頁面中多次調用幻燈切換效果,非常具有實用價值,需要的朋友可以參考下
    2015-02-02
  • 通過 Dom 方法提高 innerHTML 性能

    通過 Dom 方法提高 innerHTML 性能

    此方法大大提高了 innerHTML 在 Firefox 和 Safari 上的性能。replaceHtml() 在 Firefox 2.0.0.6 里 destroy 與 replace 的速度各快了 473 倍以及 50 倍。而在 Safari 3.0.3 beta 上則是 create 100 倍,replace 50 倍。
    2008-03-03
  • NestJs 靜態(tài)目錄配置詳解

    NestJs 靜態(tài)目錄配置詳解

    這篇文章主要介紹了NestJs 靜態(tài)目錄配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 解讀TypeScript與JavaScript的區(qū)別

    解讀TypeScript與JavaScript的區(qū)別

    這篇文章主要介紹了TypeScript與JavaScript的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • JS實現(xiàn)table表格數(shù)據排序功能(可支持動態(tài)數(shù)據+分頁效果)

    JS實現(xiàn)table表格數(shù)據排序功能(可支持動態(tài)數(shù)據+分頁效果)

    這篇文章主要介紹了JS實現(xiàn)table表格數(shù)據排序功能(可支持動態(tài)數(shù)據+分頁效果) 的相關資料,非常不錯,具有參考借鑒價值,需要的朋友一起看看吧
    2016-05-05
  • 詳細解密jsonp跨域請求

    詳細解密jsonp跨域請求

    當進行一些比較深入的前端編程的時候,不可避免地需要進行跨域操作,JSONP跨域GET請求是一個常用的解決方案,下面我們來看一下JSONP跨域是如何實現(xiàn)的,并且探討下JSONP跨域的原理。
    2015-04-04
  • JavaScript觀察者模式(publish/subscribe)原理與實現(xiàn)方法

    JavaScript觀察者模式(publish/subscribe)原理與實現(xiàn)方法

    這篇文章主要介紹了JavaScript觀察者模式(publish/subscribe)原理與實現(xiàn)方法,簡單分析了javascript觀察者模式的原理、功能并結合實例形式給出了觀察者模式的實現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • JavaScript如何實現(xiàn)組合列表框中元素移動效果

    JavaScript如何實現(xiàn)組合列表框中元素移動效果

    在頁面中有兩個列表框,需要把其中一個列表框的元素移動到另一個列表框,怎么實現(xiàn)此功能呢,下面通過本文給大家介紹JavaScript如何實現(xiàn)組合列表框中元素移動效果,感興趣的朋友一起學習吧
    2016-03-03

最新評論