0

I have a fully working model of a car mesh moving right, left, up and down using Three.JS The input data are acceleration on the X and Z direction, we apply double integration on the acceleration to compute the displacement. So I have been able to animate the car in all directions and making the background move to keep the car in the center of the canvas. However, I only need to background to move in the right and left direction, and not for the up and down

That's my code:

<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, 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, 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, 0, -1);
        dir.applyAxisAngle(new THREE.Vector3(0, 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>

I am using from a JSON file as input.

That's how the movement of the car looks like:

carMotion

You can see that the background is following the car motion. For Up and Down I only need the car to move (not the background) and the right and left are fine because is moving so it stays within the canvas. Can you please help with that?

Sami
  • 341
  • 7
  • 22
  • Just add this at the end of your animate function: `camera.position.y = 0;`. No more up/down movement! – M - May 12 '21 at 19:23
  • I tried this and it didn't work, if it is 0 on the y-axis as you mentioned then the car mesh will move violently – Sami May 18 '21 at 01:37

0 Answers0