Three.js добавить: сохранить позицию

Когда я добавляю Object3D в другой Object3D (метод "add"), дочерний объект меняет свое преобразование в зависимости от родительского.

Есть ли способ сохранить положение / вращение / масштаб ребенка после добавления его к родителю?

Скрипка: https://jsfiddle.net/pqfzd8a2/1/

mesh = new THREE.Mesh(geometry, material);    
mesh.position.y = 25;

var mesh2 = mesh.clone();
mesh2.position.y = 80;

var mesh3 = mesh2.clone();

mesh.rotation.z = Math.PI*0.25;

scene.add(mesh);    
mesh.add(mesh2);
scene.add(mesh3);

Что было сделано?

  1. Сетка вращается.
  2. mesh2 и mesh3 являются клонами друг друга с одинаковым положением.
  3. mesh2 добавляется в mesh, а mesh3 добавляется в сцену.

Разница между mesh2 и mesh3 заключается в том, что они были добавлены (созданы) к разным родителям (соответственно, к mesh и непосредственно к сцене). До того, как что-то было добавлено (создано), они были в том же положении. Суть в том, чтобы сохранить объект там, где он был до того, как был добавлен.

Ожидаемый результат: mesh2 и mesh3 должны быть в одинаковых позициях.

Фактический результат: mesh2 меняет положение / вращение / масштаб после добавления.

Как заставить объекты сохранять свое глобальное преобразование после рождения?

2 ответа

Нет, они не должны быть в одной и той же позиции, потому что вы меняете положение и вращение сетки и сетки2. Если вы добавляете меш к другому, вы добавляете его в родительский контекст.

mesh.add(mesh2); // <-- mesh is translated and rotated, mesh2 will inherit the same context

В этой скрипке вы видите, что вращение на сетке также применимо к mesh2: https://jsfiddle.net/r57opdgn/

Хорошо, это определенное поведение и, по крайней мере, причина, по которой эти иерархические структуры существуют. Если вы не хотите применять родительское преобразование к дочернему элементу, нет причин для родительских элементов этих элементов.

При таком подходе намного проще обрабатывать сложные Объекты, которые состоят из более мелких объектов, таких как автомобиль с колесами. Вместо того, чтобы двигать автомобиль и затем каждое колесо, каждый делает колеса дочерними для автомобиля, и они будут двигаться / вращаться / масштабироваться с ним все время. Таким образом, трансформация родителя "наследуется" всеми его потомками. Таким образом, их преобразование относительно их соответствующего родителя. Как будто Луна вращается вокруг Земли, которая вращается вокруг Солнца, которое вращается вокруг…

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

Другие вопросы по тегам