three.js中實(shí)現(xiàn)在場(chǎng)景中增加草地,以及相機(jī)的向前、向后、向左、向右移動(dòng)以及左右鏡頭旋轉(zhuǎn)的功能

功能展示.gif
1、首先來(lái)實(shí)現(xiàn)在場(chǎng)景中平鋪一塊草地

PlaneGeometry()方法是一個(gè)面板網(wǎng)格的函數(shù),其中有四個(gè)參數(shù),分別為網(wǎng)格的長(zhǎng)、寬、以及長(zhǎng)、寬的劃分等分?jǐn)?shù)。

        meshFloor = new THREE.Mesh(
            new THREE.PlaneGeometry(200, 200, 10, 10), //四個(gè)參數(shù),分別為草地的長(zhǎng)、寬、以及長(zhǎng)度和寬度的網(wǎng)格劃分的次數(shù),比如長(zhǎng)寬各劃分10等分。
            new THREE.MeshBasicMaterial({
                color: 0x2E7D32
            })
        )
2、定義了草地后,默認(rèn)是y軸平鋪,調(diào)整下草地的角度以及箱子的高度
        // 將草地平鋪,以及箱子位置加高
        meshFloor.rotation.x -= Math.PI / 2;
        mesh.position.y += 10;
3、把創(chuàng)建好的網(wǎng)格添加到場(chǎng)景中
        scene.add(mesh);
        scene.add(meshFloor);
4、addEventListener()加入監(jiān)聽事件

window.addEventListener("keydown", keyDown);

  • 用于向指定元素添加事件句柄。并且添加的事件句柄不會(huì)覆蓋已存在的事件句柄。也就是說你可以向一個(gè)元素添加多個(gè)事件,包括同類型的事件,如:兩個(gè) “click” 事件。
  • 第一個(gè)參數(shù)是事件的類型 (如 “click” 或 “mousedown”).第二個(gè)參數(shù)是事件觸發(fā)后調(diào)用的函數(shù)。 第三個(gè)參數(shù)是個(gè)布爾值用于描述事件是冒泡還是捕獲。該參數(shù)是可選的。
        function keyDown(event) {
            keyboard[event.keyCode] = true;
        }

        function keyUp(event) {
            keyboard[event.keyCode] = false;
        }

        window.addEventListener('keydown', keyDown);
        window.addEventListener('keyup', keyUp);
按鍵的keyCode值.png
5、向前、向后、向左、向右進(jìn)行平移:
 // 向前平移
            if (keyboard[87]) {
                camera.position.x -= Math.sin(camera.rotation.y) * player.speed;
                camera.position.z -= Math.cos(camera.rotation.y) * player.speed;
            }
            // 向后平移
            if (keyboard[83]) {
                camera.position.x += Math.sin(camera.rotation.y) * player.speed;
                camera.position.z += Math.cos(camera.rotation.y) * player.speed;
            }
            // 向左平移
            if (keyboard[65]) {
                camera.position.x -= Math.sin(camera.rotation.y + Math.PI / 2) * player.speed;
                camera.position.z -= Math.cos(camera.rotation.y + Math.PI) * player.speed;
            }
            // 向右平移
            if (keyboard[68]) {
                camera.position.x += Math.sin(camera.rotation.y + Math.PI / 2) * player.speed;
                camera.position.z += Math.cos(camera.rotation.y + Math.PI) * player.speed;
            }
6、向左向右的鏡頭旋轉(zhuǎn)

向左向右的鏡頭旋轉(zhuǎn)相對(duì)容易實(shí)現(xiàn),相機(jī)的鏡頭是有一個(gè)position的位置定位的,也就類似于一個(gè)人的一雙眼睛的位置坐標(biāo),旋轉(zhuǎn)的話只需要相對(duì)于Y軸進(jìn)行旋轉(zhuǎn)一定的角度即可。

image.png

            // 向左旋轉(zhuǎn)
            if(keyboard[37]){
                camera.rotation.y += player.rotateSpeed;
            }
            // 向右旋轉(zhuǎn)
            if(keyboard[39]){
                camera.rotation.y -= player.rotateSpeed;
            }
  • 完整代碼示例:
<html>

<head>
    <title></title>
    <style>
        body {
            margin: 0;
        }

        canvas {
            width: 100%;
            height: 100%
        }
    </style>

</head>

<body>
    <script src="./js/three.js-master/build/three.js"></script>

    <script>
        var scene, camera, renderer, mesh, meshFloor; //定義場(chǎng)景、相機(jī)、渲染器、網(wǎng)格體箱子、草地
        scene = new THREE.Scene();
        camera = new THREE.PerspectiveCamera(90, 1280 / 720, 0.1, 1000);

        var keyboard = {}
        var player = {
            height: 15,
            speed: 0.2,
            rotateSpeed:Math.PI*0.02
        }

        // 創(chuàng)建好網(wǎng)格,wireframe:不再以實(shí)體的形式顯示,只顯示線框
        mesh = new THREE.Mesh(
            new THREE.BoxGeometry(10, 10, 10),
            new THREE.MeshBasicMaterial({
                color: 0xBCAAA4,
                wireframe: true,
                transparent: true
            })
        )

        // 新建一個(gè)草地
        meshFloor = new THREE.Mesh(
            new THREE.PlaneGeometry(200, 200, 10, 10), //四個(gè)參數(shù),分別為草地的長(zhǎng)、寬、以及長(zhǎng)度和寬度的網(wǎng)格劃分的次數(shù),比如長(zhǎng)寬各劃分10等分。
            new THREE.MeshBasicMaterial({
                color: 0x2E7D32
            })
        )

        // 將草地平鋪,以及箱子位置加高
        meshFloor.rotation.x -= Math.PI / 2;
        mesh.position.y += 10;

        // 把創(chuàng)建好的網(wǎng)格添加到場(chǎng)景中
        scene.add(mesh);
        scene.add(meshFloor);

        camera.position.set(50, player.height, 50);
        camera.lookAt(new THREE.Vector3(0, player.height, 0))

        // 創(chuàng)建渲染器
        renderer = new THREE.WebGLRenderer();
        renderer.setSize(1280, 720);


        document.body.appendChild(renderer.domElement);

        animate();
        // 添加一個(gè)旋轉(zhuǎn)動(dòng)畫
        function animate() {
            requestAnimationFrame(animate); //每一幀回調(diào)執(zhí)行這個(gè)函數(shù)
            // mesh.position.x += 0.01;
            // mesh.position.z += 0.01;
            mesh.rotateY(0.01);
            mesh.rotateX(0.01);
            renderer.render(scene, camera);

            // 向前平移
            if (keyboard[87]) {
                camera.position.x -= Math.sin(camera.rotation.y) * player.speed;
                camera.position.z -= Math.cos(camera.rotation.y) * player.speed;
            }
            // 向后平移
            if (keyboard[83]) {
                camera.position.x += Math.sin(camera.rotation.y) * player.speed;
                camera.position.z += Math.cos(camera.rotation.y) * player.speed;
            }
            // 向左平移
            if (keyboard[65]) {
                camera.position.x -= Math.sin(camera.rotation.y + Math.PI / 2) * player.speed;
                camera.position.z -= Math.cos(camera.rotation.y + Math.PI) * player.speed;
            }
            // 向右平移
            if (keyboard[68]) {
                camera.position.x += Math.sin(camera.rotation.y + Math.PI / 2) * player.speed;
                camera.position.z += Math.cos(camera.rotation.y + Math.PI) * player.speed;
            }
            // 向左旋轉(zhuǎn)
            if(keyboard[37]){
                camera.rotation.y += player.rotateSpeed;
            }
            // 向右旋轉(zhuǎn)
            if(keyboard[39]){
                camera.rotation.y -= player.rotateSpeed;
            }
        }

        function keyDown(event) {
            keyboard[event.keyCode] = true;
        }

        function keyUp(event) {
            keyboard[event.keyCode] = false;
        }

        window.addEventListener('keydown', keyDown);
        window.addEventListener('keyup', keyUp);
    </script>
</body>

</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容