Пушка js перемещение физического тела с анимацией - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь разобраться в этом некоторое время и просто не могу найти решение. Работаю с тремя JS и библиотекой Cannon. Я создал простой объект / me sh с анимацией движения. С помощью библиотеки Cannon Library я добавил физическое тело мне sh. Я помещаю анимацию в me sh, чтобы она меняла вращение, но вращение физического тела просто не менялось. вторая позиция

Первая позиция

Здесь я определяю физику:

class Physics {

    constructor() {
        this.world = new CANNON.World();
        this.stepSize = 0;
        this.timeToGo = 0;
        this.visualObjects = [];
        this.physicalBodies = [];
    }

    addPair(visualObject, body) {
        this.visualObjects.push(visualObject);
        this.physicalBodies.push(body);
    }

    initialize(gravityX, gravityY, gravityZ, stepsize, addfloor) {

        this.world.gravity.set(gravityX, gravityY, gravityZ);
        this.world.broadphase = new CANNON.NaiveBroadphase();
        his.stepSize = stepsize;

        if (addfloor) {
            var floor = new CANNON.Body({
                shape: new CANNON.Plane(),
                mass: 0
            });
            floor.quaternion.setFromAxisAngle(new CANNON.Vec3(1, -0, 0), -Math.PI / 2);
            floor.position.y = -32;
            this.world.addBody(floor);
        }
    }

    update(delta) {

        // Step physics world forward
        this.timeToGo += delta;
        while (this.timeToGo >= this.stepSize) {
            this.world.step(this.stepSize);
            this.timeToGo -= this.stepSize;
        }
        // Copy transformations
        for (var i = 0; i < this.visualObjects.length; i++) {
            this.visualObjects[i].position.copy(this.physicalBodies[i].position);
            this.visualObjects[i].quaternion.copy(this.physicalBodies[i].quaternion);
        }
    }

    getWorld() {
        return this.world;
    }
    addStandPhysical(visualObject, mass){

        var shapeAblage = new CANNON.Box(new CANNON.Vec3(0.5*2,0.5*8,0.5*40));
        var shapeMittelstrebe = new CANNON.Box(new CANNON.Vec3(0.5*10,0.5*1,0.5*100));
        var shapeAblage3 = new CANNON.Box(new CANNON.Vec3(0.5*2.5,0.5*1,0.5*15));
        var shapeAblage4 = new CANNON.Box(new CANNON.Vec3(0.5*2.5,0.5*1,0.5*15));
        var shapeFuss5 = new CANNON.Box(new CANNON.Vec3(0.5*2.5,0.5*1,0.5*15));

        var shapeMittelding = new CANNON.Cylinder(2,2,25,32)

        var body = new CANNON.Body({ mass: mass });


        body.addShape(shapeAblage, new CANNON.Vec3(-1.25, 29, 41), new CANNON.Quaternion().setFromEuler( 0, 90*DEG_TO_RAD,90*DEG_TO_RAD, "XYZ")); //ablage1
        body.addShape(shapeAblage, new CANNON.Vec3(-1.25, 29, -41), new CANNON.Quaternion().setFromEuler( 0, 90*DEG_TO_RAD,90*DEG_TO_RAD, "XYZ")); //ablage2
        body.addShape(shapeAblage, new CANNON.Vec3(-1.25, -29, -41), new CANNON.Quaternion().setFromEuler( 0, 90*DEG_TO_RAD,90*DEG_TO_RAD, "XYZ")); //ablage3
        body.addShape(shapeAblage, new CANNON.Vec3(-1.25, -29, 41), new CANNON.Quaternion().setFromEuler( 0, 90*DEG_TO_RAD,90*DEG_TO_RAD, "XYZ")); //ablage4

        body.addShape(shapeMittelstrebe, new CANNON.Vec3( 1.75, 0, 0), new CANNON.Quaternion().setFromEuler(35* DEG_TO_RAD, 0, 0, "XYZ"));
        body.addShape(shapeMittelstrebe, new CANNON.Vec3( -1.75, 0, 0), new CANNON.Quaternion().setFromEuler(-35* DEG_TO_RAD, 0, 0, "XYZ"));


        body.position.copy(visualObject.position);
        body.quaternion.copy(visualObject.quaternion);



        this.world.addBody(body);

        this.addPair(visualObject, body);
    }
}

И это в основном моя main:

function main() {

    scene = new THREE.Scene();

    physics = new Physics();
    physics.initialize(0, -200, 0, 1 / 120, floor = false); //Hier mit der Stepsize vielleicht noch ein wenig experimentieren und herausfinden, was sie macht
    physicsVisualDebugger = new THREE.CannonDebugRenderer(scene, physics.getWorld());

    var stand = new Stand();
    physics.addStandPhysical(stand,3);

    scene.add(stand);

    var clock = new THREE.Clock();

    function mainLoop() {

        stats.begin();

        var delta = clock.getDelta();

        physics.update(delta);
        physicsVisualDebugger.update();

        stand.animations.forEach(function (animation) {
            animation.update(delta);
        });

        TWEEN.update();


        renderer.render(scene, camera);

        stats.end();

        requestAnimationFrame(mainLoop);
    }
}

Итак, короткий вопрос: как мне заставить физические тела двигаться с моей анимацией мешей на землю?

...