Физический движок Threejs & PhysiJs не обновляется при вращении сетки - PullRequest
0 голосов
/ 01 ноября 2018

Я новичок в Threejs.

Я создал Box Mesh и Sphere Mesh и применил физику, используя PhysJs. Я хочу ударить по мячу, когда Box Mesh вращается и проходит через мяч. Однако, когда сетка коробки вращается, она проходит без удара по мячу. Я думаю, что сетчатая сетка теряет физичность, когда начинает вращаться.

function createBall () {
    var ball = null;
    var ballGeo = new THREE.SphereGeometry(1.5, 30, 30);
    var ballMat = Physijs.createMaterial(
        new THREE.MeshBasicMaterial({specular: 0x111111})
        , 0.3, 0.1
    );
    ball = new Physijs.SphereMesh(
      ballGeo,
      ballMat,
      5
    );
    ball.position.set(30, 10, 0);
    scene.add(ball);
}
function createBox () {
    var material = Physijs.createMaterial(
        new THREE.MeshLambertMaterial(
            {
                color: 0x8041D9,
            }), 5, 0.3);

    var boxMesh = new THREE.BoxGeometry(5, 5, 25);
    box = new Physijs.BoxMesh(
        boxMesh,
        material,
        5
    );
    box.position.z = 20;
    scene.add(box);
}
function createHeightMap() {
    var initColor = new THREE.Color( 0x00ff00 );
    initColor.setHSL( 0.25, 0.85, 0.5 );
    var ground_material = Physijs.createMaterial(
        new THREE.MeshPhongMaterial(
            { color: 0x47C83E}
        ),
        .5,
        .5
    );

    var ground_geometry = new THREE.PlaneGeometry(800, 800, 100, 100);
    ground = new Physijs.HeightfieldMesh(
        ground_geometry,
        ground_material,
        0, // 질량
        100, // PlaneGeometry 의 분할 세그먼트랑 똑같은 값으로 줘야 한다.
        100  // PlaneGeometry 의 분할 세그먼트랑 똑같은 값으로 줘야 한다.
    );

    ground.position.y = -10;
    ground.rotation.x = Math.PI / -2;
    ground.receiveShadow = true;


    var meshes = [];
    var controls = new function () {
        this.startRotate = false;
        this.addBall = function () {
            createBall();
        };
        this.addBox = function () {
            createBox();
        };
        this.clearMeshes = function () {
            meshes.forEach(function (e) {
                scene.remove(e);
            });
            meshes = [];
        }

    };

    var gui = new dat.GUI();
    gui.add(controls, 'addBall');
    gui.add(controls, 'addBox');
    gui.add(controls, 'clearMeshes');
    gui.add(controls, 'startRotate').onChange(function (e) {
        isStartRoate = e;
    });
    return ground;
}

render = function () {
    stats.update();
    if (isStartRoate === true) {
        var rotateMatrix = new THREE.Matrix4();
        rotateMatrix.identity();
        rotateMatrix.makeRotationY(0.05);
        box.applyMatrix(rotateMatrix);
    }
    requestAnimationFrame(render);
    renderer.render(scene, camera);
    var axes = new THREE.AxesHelper(30);
    scene.add(axes);
    scene.simulate(undefined, 2);
};

function initStats() {

    var stats = new Stats();

    stats.setMode(0); // 0: fps, 1: ms

    // Align top-left
    stats.domElement.style.position = 'absolute';
    stats.domElement.style.left = '0px';
    stats.domElement.style.top = '0px';

    document.getElementById("Stats-output").appendChild(stats.domElement);

    return stats;
}


window.onload = initScene;

ниже - ссылка codepen

codepen

Кажется, физичность не обновлена. пожалуйста, дайте мне любую идею

1 Ответ

0 голосов
/ 01 ноября 2018

При использовании Physijs вы должны использовать setLinearVelocity() или setAngularVelocity(), чтобы корректно обновлять положение и поворот ваших объектов. Обновленная кодовая ручка демонстрирует этот подход:

https://codepen.io/anon/pen/YJmajN

Кроме того, способ создания AxesHelper в цикле рендеринга не является хорошим подходом. Создайте помощника один раз во время настройки вашей сцены.

...