Смена родителей 3D-модели с сохранением той же позиции - PullRequest
1 голос
/ 03 августа 2020

Я использую три библиотеки. js для работы с 3D-моделями (в основном .glb, но это не имеет значения)

Идея состоит в том, чтобы импортировать 3D-модель, которая содержит группы и сетки. Я хочу иметь возможность перемещать сетки между уже существующими группами в модели без изменения визуального представления модели. Часть моего кода ниже. moveInternal - это

movedMesh.matrixWorldNeedsUpdate = true; // not sure if it's needed
let meshPosition = new THREE.Vector3();
movedMesh.getWorldPosition(meshPosition);

oldParent.remove(movedMesh);
newParent.add(movedMesh);

movedMesh.worldToLocal(meshPosition);
movedMesh.position.set(meshPosition.x, meshPosition.y, meshPosition.z);

И это не работает. Я sh меняет свою глобальную позицию, потому что позиция нового родителя не совпадает с предыдущей родительской позицией, но я ожидаю, что она останется там, где была, но изменит свою локальную позицию с учетом позиции нового родителя.

Что мне делать неправильно?

1 Ответ

1 голос
/ 03 августа 2020

Я думаю, вам нужно обновить мировую матрицу movedMesh после того, как вы измените его родителей. Когда вы .remove(), а затем .add(), он не знает, что его родители были обновлены (3. js обычно делает это при рендеринге, но это происходит до рендеринга следующего кадра).

let meshPosition = new THREE.Vector3();
movedMesh.getWorldPosition(meshPosition);

oldParent.remove(movedMesh);
newParent.add(movedMesh);

// Here it needs to re-learn its new coordinates
movedMesh.updateMatrixWorld(true);

movedMesh.worldToLocal(meshPosition);
movedMesh.position.set(meshPosition.x, meshPosition.y, meshPosition.z);
...