Как обновить вращательный круг объектов после изменения положения - PullRequest
0 голосов
/ 27 февраля 2020

Когда я использую клавишу "w", чтобы переместить мой объект, а затем нажимаю клавишу "x", чтобы повернуть его, мой объект вращается вокруг источника мира, а не его собственного центра. Как мне обновить сводку объектов после переезда? Я видел несколько вопросов и ответов на этот вопрос, где указано, что он использует geometry.center (), однако это не работает для меня.

var tMatrix = new THREE.Matrix4()
var radian = 5*Math.PI/180
function keyDown(event){

    if(event.key == 'x'){
        r5 = Math.cos(radian);
        r6 = -Math.sin(radian);
        r8 = Math.sin(radian);
        r9 = Math.cos(radian);
        tMatrix.set( 1, 0, 0, 0,
                    0, r5, r6, 0,
                    0, r8, r9, 0,
                    0, 0, 0, 1 );
        mesh.applyMatrix4(tMatrix);

    }

    if(event.key == 'w'){
        tMatrix.set( 1, 0, 0, 0,
                    0, 1, 0, 1,
                    0, 0, 1, 0,
                    0, 0, 0, 1 );
        mesh.applyMatrix4(tMatrix);

    }
}


var pivot = new THREE.Object3D();
let loader = new THREE.STLLoader();
var material = new THREE.MeshLambertMaterial({color: 0x818181});

loader.load('STL/test.stl', function (geometry) {
    mesh = new THREE.Mesh(geometry, material);
    scene.add(mesh);
});

window.addEventListener("keypress", keyDown);

1 Ответ

0 голосов
/ 28 февраля 2020

Хорошо, я решил проблему, просто получив положение объекта до его поворота, а затем установив исходное положение после установки новой матрицы.

if(event.key == 'x'){
    x = mesh.position.x;
    y = mesh.position.y;
    z = mesh.position.z;

    r5 = Math.cos(radian);
    r6 = -Math.sin(radian);
    r8 = Math.sin(radian);
    r9 = Math.cos(radian);
    tMatrix.set( 1, 0, 0, 0,
                0, r5, r6, 0,
                0, r8, r9, 0,
                0, 0, 0, 1 );
    mesh.applyMatrix4(tMatrix);
    mesh.position.set(x,y,z);
}
...