Лучшая практика для глубокого копирования клона 3D-объекта? - PullRequest
0 голосов
/ 08 апреля 2019

Я работаю над редактором объектов в three.js.Прямо сейчас я борюсь с одной проблемой.Я загружаю облако точек, создаю его клон и сохраняю его как исходный объект по умолчанию и выполняю поворот матрицы в загруженном облаке точек.

let loaderMaster = new THREE.PLYLoader();
loaderMaster.load('./ply_data/rawMaster.ply', function(mGeom) {

        var scanMaterialM = new THREE.PointsMaterial({
            size: 15,
            color: 0xff0000
        });
        mGeom.computeVertexNormals();

        masterCloud = new THREE.Points(mGeom, scanMaterialM);


        masterCloud.rotation.x = -90 * Math.PI / 180;
        masterCloud.geometry.scale(-1, -1, 1);
        masterCloud.name = "masterMesh";

        masterRawGeo = masterCloud.clone();

        scene.add(masterCloud)

        transformControlmaster.attach(masterCloud)
        scene.add(transformControlmaster);
        transform('master');
    });

На этом первом шаге все работает нормально.Когда что-то должно быть выполнено во второй раз.Я удаляю текущее облако точек со сцены и заменяю его исходным клоном по умолчанию, а затем выполняю новую матричную манипуляцию с ним.Но результат - полная чушь.Кажется, даже я удалил объект и очистил сцену, каким-то образом первые манипуляции каким-то образом сохранены.Как лучше всего заменить геометрию клоном с глубоким копированием, совершенно не подверженным влиянию предыдущих манипуляций?

Заранее большое спасибо !!!

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Спасибо большое!

UPDATE:

Итак, я нашел свою проблему. Я перепутал манипуляции с сеткой и геометрией. С клоном сетки «masterRawGeo» я сохранил начальную сетку и всегда обновлялся до первоначальных настроек. Но, к сожалению, я также сделал операцию масштабирования (-1, 1, 1) с геометрией "mGeom", которая была передана клону. Таким образом, изменения геометрии также повлияли на клона. На самом деле требуется время, чтобы войти в это. Что касается производительности, я лучше использую только одну геометрию и выполняю все манипуляции с сеткой, верно?

0 голосов
/ 08 апреля 2019

Если вы на самом деле преобразуете геометрию (например, с помощью BufferGeometry.translate () ), вам необходимо создать копию mGeom. Если вместо этого вы преобразуете объект THREE.Points (фактическое облако точек), данные геометрии не изменятся. Создание нового экземпляра THREE.Points с тем же объектом геометрии уже должно работать.

Если это не так, рассмотрите возможность демонстрации вашей проблемы на живом примере .

...