Три.js: добавление и удаление дочерних элементов повернутых объектов

Я пытаюсь имитировать кубик Рубика. Я хотел выбрать лицо наугад и повернуть его. Поэтому я создал 27 кубических сеток и расположил их. Вы можете видеть рабочий (беспорядочно) кубик Рубика здесь http://codepen.io/theonepa1/full/fzAli

в чем проблема.

Как вы можете видеть из приведенной выше ссылки, меньшие Кубы по краям перемещаются случайным образом (по крайней мере, не так, как я ожидаю)

Что я сделанный.

при попытке повернуть грань я сгруппировал 9 кубов, принадлежащих грани, добавил их в качестве дочерних объектов к новому объекту Object3D. Я тогда повернул object3d вдоль своей оси с помощью object3d.поворот.x (или y или z).

Что я отладил

Я убедился, что кубики, которые я выбираю для второго поворота лица, верны. После того, как первое вращение лица завершено, я обновляю их виртуальные позиции (не фактические координаты). Так что для второго лица вращение я проверил, что кубики выбраны правильно.

что на самом деле происходит

одно замечание, которое я сделал, заключалось в том, что оси кубов (меньшие) изменяются после поворота object3d (родитель, держащий 9 кубов грани). А также координаты кубов не обновляются автоматически после поворота граней. Скажем, например, если один из кубов имеет (0,0,22) в качестве координат перед гранью вращения, координаты такие же, даже после вращения. Однако изменяется ориентация осей Куба.

каков наилучший способ поворота группы объектов вокруг оси ? Использует Object3D правильно ? Мы должны удалить детей из одного родителя, прежде чем добавлять его в другую группу для второго поворота лица ?

должен ли я сделать какое-то обновление для отдельных кубов, прежде чем добавлять их во вторую группу для второго поворота лица ?

Я читал некоторые сообщения о applyMatrixWorld, но я действительно мог не понимаю, как это повлияло на ориентацию осей а координаты Куба ?

можете ли вы сообщить мне, где я могу прочитать о концепциях , таких как applyMatrixWorld, это какая-то общая концепция в обычный 3D-программирования ?

Это очень длинный вопрос. Был бы очень признателен за ваш ответ:)

1 ответов


фокус в том, чтобы использовать THREE.SceneUtils.attach() и THREE.SceneUtils.detach().

вы должны начать со всех ваших 27 кубов, как ребенок scene.

пусть pivot будет Object3D().

пусть active быть массивом, содержащим 9 кубов, которые вы хотите повернуть. Теперь сделайте кубики дочерним элементом pivot:

pivot.rotation.set( 0, 0, 0 );
pivot.updateMatrixWorld();

for ( var i in active ) {

    THREE.SceneUtils.attach( active[ i ], scene, pivot );

}

затем, после вращения, положите кубики обратно как дети scene.

pivot.updateMatrixWorld();
for ( var i in active ) {

    cubes[ i ].updateMatrixWorld(); // if not done by the renderer
    THREE.SceneUtils.detach( active[ i ], pivot, scene );

}

читать SceneUtils.js источник так что вы понимаете, что происходит?

эти утилиты можно найти в /examples/js/utils/SceneUtils.js. Этот файл должен быть добавлен в ваш проект.

три.js r.96