Three.js — расчет относительных поворотов

У меня есть THREE.Scene с двумя добавленными сетками, meshA и meshB, каждая из которых повернута по-разному. Моя цель — удалить meshB из сцены и повторно добавить его как дочерний элемент meshA, сохранив при этом его глобальное положение и поворот — другими словами, положение и поворот meshB должны отображаться одинаково до и после этого кода.

Моя текущая, почти рабочая попытка выглядит следующим образом:

var globalOffset = new THREE.Vector3().subVectors( meshB.position, meshA.position );
var localOffset = meshA.worldToLocal( meshB.position );

var rotationOffset = meshA.quaternion.clone().inverse();
var rotation = meshB.quaternion.clone().multiply( rotationOffset );

scene.remove(meshB);
meshA.add(meshB);

meshB.position = localOffset;
meshB.rotation.setFromQuaternion(rotation);

Позиционирование работает нормально; вращение работает только в том случае, если meshA и meshB были повернуты вокруг одной и той же оси - если meshA и meshB были повернуты вокруг разных осей, meshB меняет вращение до и после этого кода.

Любые идеи, как я могу исправить приведенный выше код (или идею для другого подхода), чтобы meshB по-прежнему имел одно и то же «глобальное» вращение до и после удаления и повторного добавления в сцену?

Спасибо!


person Lee Stemkoski    schedule 11.04.2014    source источник


Ответы (1)


Вы хотите удалить meshB из сцены и повторно добавить его как дочерний элемент meshA, сохранив при этом его глобальное положение и поворот.

Вы можете сделать это так:

meshA.attach( meshB );

три.js р.109

person WestLangley    schedule 11.04.2014