ThreeJS:如何仅向一个方向移动背景?

如何解决ThreeJS:如何仅向一个方向移动背景?

我有一个完整的汽车网格模型,使用 Three.JS 向右、向左、向上和向下移动 输入数据是 X 和 Z 方向上的加速度,我们对加速度应用二重积分来计算位移。所以我已经能够在各个方向上为汽车设置动画,并使背景移动以使汽车保持在画布的中心。但是,我只需要background 左右移动,而不是上下移动

这是我的代码

<html>

<head>
    <style>
        canvas {
            position: fixed;
            top: 0;
            left: 0;
        }
    </style>
</head>

<body>
    <script src="./libs/three.min.js"></script>
    <script src="./libs/OrbitControls.js"></script>
    <script src="./libs/KeyboardState.js"></script>
    <script src="./libs/MTLLoader.js"></script>
    <script src="./libs/OBJMTLLoader.js"></script>
    <script src="./data/accXaccZCOMBINEDMOTIONS.json"></script>
</body>

<script>
    var data = JSON.parse(JSON.stringify(data));
    var toycar;
    var valid = 1;
    const dispArrayX = Array.from({ length: 1 }).fill(0);
    const dispArrayZ = Array.from({ length: 1 }).fill(0);
    let sensorValue = 0;
    var initialVeLocity = 0;
    var angle = 0;
    var currentIndex = 0;
    var initialdisplacement = 0;
    var scene,renderer,camera;
    var width = window.innerWidth;
    var height = window.innerHeight;
    var time = data[currentIndex].time
    var pos = new THREE.Vector3(0,0);

    init();
    animate();

    function init() {
        var width = window.innerWidth;
        var height = window.innerHeight;

        renderer = new THREE.Webglrenderer({ antialias: true,alpha: true });
        renderer.setClearColor(0x626d73,1);
        renderer.setSize(width,height);
        document.body.appendChild(renderer.domElement);
        
        scene = new THREE.Scene();

        camera = new THREE.PerspectiveCamera(10,width / height,1,10000);
        // camera.position.y = -150;
        // camera.position.y = 200;
        // camera.position.x = 100;
        
        camera.lookAt(new THREE.Vector3(0,0));

        var loader = new THREE.OBJMTLLoader();
        loader.load('https://jyunming-chen.github.io/tutsplus/models/toycar.obj','https://jyunming-chen.github.io/tutsplus/models/toycar.mtl',function (object) {
                toycar = object;
                toycar.rotateZ(10.8); //toycar.rotateZ(-10.99);
                scene.add(toycar);
            });

        var gridXZ = new THREE.GridHelper(100000,10);
        gridXZ.setColors(new THREE.Color(0xff0000),new THREE.Color(0xffffff));
        scene.add(gridXZ);

        var pointLight = new THREE.PointLight(0xffffff);
        pointLight.position.set(350,10,5);
        scene.add(pointLight);

        var ambientLight = new THREE.AmbientLight(0x111111);
        scene.add(ambientLight);
    }

    function animate(dt) {
        let time = data[currentIndex].time
        dt *= 10 ** -9
        time += dt

        while (data[currentIndex].time < time) {
            currentIndex++
            if (currentIndex >= data.length) return
        }

        const { accX,accZ } = data[currentIndex]

        var dir = new THREE.Vector3(0,-1);
        dir.applyAxisAngle(new THREE.Vector3(0,0),10);
        pos.add(dir);

        if (toycar != undefined) {
            toycar.scale.set(0.1,0.1,0.1);
            if (currentIndex > 0) {

                // compute the displacement by double integrating the acceleration for accZ (e.i. Right and left movement)
                const deltaTime        = ((data[currentIndex].time) / (24 * 60 * 60)) - 1; // convert time from second per day to second
                const veLocityInitialZ = ((data[currentIndex-3].accZ + data[currentIndex-2].accZ)/2)*deltaTime; // compute initialVeLocity two step backward
                const veLocityCurrentZ = veLocityInitialZ + ((data[currentIndex-1].accZ + data[currentIndex].accZ)/2)*deltaTime; // compute currentVeLocity one step backward                
                const prevIoUsdispZ    = dispArrayZ[0] + (deltaTime * ((veLocityCurrentZ + veLocityInitialZ)/2));
                dispArrayZ[0]          = prevIoUsdispZ;
                const dispCurrentZ = prevIoUsdispZ + dispArrayZ[0];

                // compute the displacement by double integrating the acceleration for accX (e.i. Up and down movement)
                const veLocityInitialX   = ((data[currentIndex-3].accX + data[currentIndex-2].accX)/2)*deltaTime; // compute initialVeLocity two step backward
                const veLocityCurrentX   = veLocityInitialX + ((data[currentIndex-1].accX + data[currentIndex].accX)/2)*deltaTime; // compute currentVeLocity one step backward                
                const prevIoUsdispX      = dispArrayX[0] + (deltaTime * ((veLocityCurrentX + veLocityInitialX)/2));
                dispArrayX[0]            = prevIoUsdispX;
                const dispCurrentX       = prevIoUsdispX + dispArrayX[0];
                const dispCurrentXscaled = dispCurrentX/3500;

                // Move the car up and down
                if (dispCurrentXscaled*0.0001 < 0){
                    toycar.position.x     = dispCurrentXscaled*0.00001;
                } 
                else if (dispCurrentXscaled*0.0001 > 8){
                    toycar.position.x     = dispCurrentXscaled*0.0000001;
                }
                 else{
                    toycar.position.x     = dispCurrentXscaled*0.0001;
                }

                toycar.position.y = 0;
                // Move the car right and left
                toycar.position.z = -(dispCurrentZ/4000)*0.0005;
                // print out displacementX and displacementZ 
                console.log("dispX: " + (dispCurrentX*0.0000001).toFixed(5) + "    dispZ: " + ((dispCurrentZ/4000)*0.0005).toFixed(5));
            }
            toycar.rotation.x = (angle + Math.PI);;
            var relativeCameraOffset = new THREE.Vector3(-1600,400,0);
            var cameraOffset = relativeCameraOffset.applyMatrix4(toycar.matrixWorld);
            camera.position.x = cameraOffset.x*0.5;
            camera.position.y = cameraOffset.y;
            camera.position.z = cameraOffset.z;
            camera.lookAt(toycar.position);
        }

        requestAnimationFrame(animate);
        renderer.render(scene,camera);
    }

</script>

</html>

我使用 JSON 文件作为输入。

这就是汽车运动的样子:

carMotion

您可以看到背景跟随汽车运动。对于上下,我只需要汽车移动(而不是背景),左右都很好,因为正在移动,所以它留在画布内。你能帮忙吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?