溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2023-04-28 10:02:31 來源:億速云 閱讀:139 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要介紹“怎么使用Three.js物理引擎Cannon.js創(chuàng)建簡單應(yīng)用程序”,在日常操作中,相信很多人在怎么使用Three.js物理引擎Cannon.js創(chuàng)建簡單應(yīng)用程序問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用Three.js物理引擎Cannon.js創(chuàng)建簡單應(yīng)用程序”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

    正文

    Three.js 和 Cannon.js 是兩個非常流行的 JavaScript 庫,用于創(chuàng)建 3D 游戲和交互式應(yīng)用程序。Three.js 是一個用于創(chuàng)建 3D 圖形的庫,而 Cannon.js 是一個用于物理模擬的庫。

    在 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 對象關(guān)聯(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 對象關(guān)聯(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)在,我們已經(jīng)成功地創(chuàng)建了一個簡單的物理模擬應(yīng)用程序,使用了 Three.js 和 Cannon.js 庫。我們可以通過添加更多的 Three.js 對象和 Cannon.js 物體來擴展這個應(yīng)用程序,以創(chuàng)建更復(fù)雜的物理模擬場景。

    完整的示例

    下面是一個完整的示例,一個紅色小球從高空跌落,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 對象關(guān)聯(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材質(zhì)
      const material = new THREE.MeshPhongMaterial({ color: 0xff0000 });
      const ball = new THREE.Mesh(geometry, material);
      // 設(shè)置小球的初始位置
      // 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);
      // 設(shè)置小球的初始位置和速度
      body.position.set(x, 25, z);
      body.velocity.set(0, -9.82, 0);
      // 將 Cannon.js 物體與 Three.js 對象關(guān)聯(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();

    到此,關(guān)于“怎么使用Three.js物理引擎Cannon.js創(chuàng)建簡單應(yīng)用程序”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI