Добейтесь желаемого значения после 3D броска кубика без смены текстуры лица

Я играю в 3D-игру в кости и дошла до одной проблемы: не могу обернуться, поэтому обращаюсь к вам за помощью.

В сцене / мире (используя threejs с cannonjs) у меня есть самолет и один кубик, который я кидаю в самолет (скриншоты здесь предварительно прокручивают http://prntscr.com/l9rat5, результат http://prntscr.com/l9rdeb). Все работает нормально, пока я не хочу бросить какое-то конкретное значение на кубик, например 1.

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

У меня есть эти вопросы:

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

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

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

Если не ясно, что я имею в виду, дайте мне знать, пожалуйста.

Большое спасибо, м

2 ответа

Решение

Для заметки, я решил это, вращая только геометрию (не сетку) в три раза и вообще не касаясь кватерниона тела.

Прежде всего, убедитесь, что вы используете симуляцию с фиксированным шагом. Вы делаете это, передавая 3 аргумента в world.step() вместо одного. Это гарантирует, что ваша симуляция будет вести себя одинаково каждый раз, независимо от частоты кадров.

Также удостоверьтесь, что ваше начальное положение, скорость и сила кубика одинаковы при каждом броске.

Если вы строите кватернион, используя встроенные функции пушек, такие как.setFromAxisAngle(), все должно быть хорошо... Используйте.setFromAxisAngle () с углами в 90 градусов вокруг разных осей. Зачем использовать кватернион обратный?

Если вы хотите альтернативный способ вращения матрицы, поместите сетку под пустой родительской сеткой в ​​вашей сцене. Во время симуляции скопируйте вывод cannon.js в родительскую сетку. Затем поверните дочернюю матрицу, чтобы получить желаемое начальное (и конечное) вращение.

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