Как я могу преобразовать движение mesh.locallyTranslate Vector3 в движение в мировом пространстве, чтобы придать импульс объекту?

У меня есть следующая сцена https://rawgit.com/bicarbon8/SpaceSim/MomentumProblem/babylon.html, который я настроил с возможностью поворота с помощью следующих клавиш:

  • я = шаг вниз
  • k = шаг вверх
  • j = катиться влево
  • л = повернуть направо
  • u = рыскание влево
  • о = рыскание вправо
  • / = отменить все вращения

и для перемещения с помощью следующих клавиш:

  • д = двигаться вперед
  • а = двигаться назад
  • s = стрейф влево
  • f = вправо
  • е = двигаться вверх
  • д = двигаться вниз
  • \ = отменить все движения

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

Я отслеживаю движение в каждом направлении через отдельный объект со значениями x, y и z, так что каждое нажатие клавиатуры для движения только изменяет этот объект, который затем применяется к сетке для каждого цикла цикла анимации, но потому что я использую:

mesh.locallyTranslate(новый BABYLON.Vector3(x, y, z))

когда сетка вращается, движение вращается вместе с сеткой. Как я могу преобразовать направление вращения сетки в Vector3, который я могу использовать с переводом на основе мира, чтобы последующее вращение сетки не влияло на уже имеющееся движение?

ПРИМЕЧАНИЕ: это должно имитировать движение в условиях микрогравитации / без гравитации.

Заранее благодарю за любую помощь.


person bicarbon8    schedule 01.11.2017    source источник


Ответы (1)


мне удалось найти решение самостоятельно с помощью комбинации движка Unity и решений Three.js для аналогичного типа проблемы с последующим просмотром страниц github Babylon.js. Чтобы исправить это, мне пришлось изменить мой глобально отслеживаемый объект скорости с прямого ввода, основанного на нажатиях клавиш, на вычисляемый BABYLON.Vector3 на основе мировой матрицы меша и нормализованный вектор3 для направления в локальном пространстве, которое я хотел переместить меш, который затем добавляется к существующему глобальному Vector3, используемому для отслеживания импульса (и затем применяется к сетке с использованием преобразования мирового пространства.

Оригинал:

var direction = new BABYLON.Vector3.Zero(); // global
...
// on keypress of 'q' key apply thrust along 'z' axis
if (map["q"]) { // forward thrust
  direction.z += 0.001;
};
...
// apply translation to mesh
mesh.locallyTranslate(new BABYLON.Vector3(x, y, z));

Исправлено:

var velocity = new BABYLON.Vector3.Zero(); // global
...
// on keypress of 'q' key apply thrust along 'z' axis using mesh world matrix to convert to world space vector
if (map["q"]) { // forward thrust
  var matrix = mesh.getWorldMatrix();
  var vector = new BABYLON.Vector3.Zero();
  vector = BABYLON.Vector3.TransformNormal(new BABYLON.Vector3(0, 0, 1), matrix);
  velocity.addInPlace(vector);
};
...
// apply translation to mesh
mesh.translate(velocity, 0.001, BABYLON.Space.WORLD);

Теперь объект «скорость» сохраняет импульс, и объект может свободно вращаться и применять дополнительные изменения к объекту «скорости» в зависимости от его вращения и направления тяги.

Пример кода: https://rawgit.com/bicarbon8/SpaceSim/FixTranslationMomentum/babylon.html

person bicarbon8    schedule 02.11.2017