Я делаю трехмерную игру в кости и дошел до одной проблемы, которую не могу понять, поэтому обращаюсь к вам за помощью.
В сцене / мире (с использованием threejs с cannonjs) у меня есть самолет и один кубик, который я бросаю на самолет (скриншоты здесь перед роликом http://prntscr.com/l9rat5, результат http://prntscr.com/l9rdeb). Все работает нормально, пока я не захочу задать какое-то конкретное значение на кристалле, например, 1.
Поскольку я использую загруженные модели вместо изображений текстур для граней куба, я не могу справиться с этим, просто меняя грани куба в threejs (поскольку в модели их сотни). Поэтому я надеялся, что смогу добиться этого, каким-то образом изменив начальный кватернион тела (как бы предварительно повернув его), чтобы кубик упал на определенную сторону. Сетка штампа точно соответствует положению тела и кватерниону.
У меня есть такие вопросы:
Это вообще возможно? Может быть, когда я изменяю предварительный бросок кватерниона, это всегда будет приводить к другому конечному кватерниону, который я не могу определить? Если это невозможно сделать с кватернионами, какие-нибудь советы?
Если это возможно, как мне выяснить, на какой кватернион мне нужно умножить начальный, чтобы получить желаемое значение результата 1? У меня есть последний кватернион, и я знаю, какие значения находятся на каждой грани из эмулированного броска, поэтому я пытался поиграть с обратным кватернионом, но безуспешно.
Если я просто поверну исходное тело так, чтобы грань 1 поворачивалась к грани результата (например, 6), в некоторых случаях это работает (я выбрасываю 1, когда результат эмуляции был 6), но когда бросок становится более сложным (больше вращений), это не работает конечно, так как я не рассчитываю на все возможные повороты.
Если не понятно, что я имею в виду, дайте мне знать, пожалуйста.
Большое спасибо м
Прежде всего, убедитесь, что вы используете симуляцию с фиксированным шагом. Вы делаете это, передавая world.step () 3 аргумента вместо одного. Это гарантирует, что ваша симуляция будет вести себя каждый раз одинаково, независимо от частоты кадров.
Также убедитесь, что ваше начальное положение, скорость и сила кубика одинаковы при каждом броске.
Если вы создаете кватернион, используя встроенные функции пушки, такие как .setFromAxisAngle (), все должно быть хорошо ... Используйте .setFromAxisAngle () с даже 90-градусными углами вокруг другой оси. Зачем использовать обратный кватернион?
Если вам нужен альтернативный способ вращения кубика, поместите сетку под пустой родительской сеткой в вашей сцене. Во время симуляции скопируйте вывод cannon.js в родительский меш. Затем поверните дочернюю сетку кубика, чтобы получить желаемое начальное (и конечное) вращение.
Что касается заметки, я решил это, повернув только геометрию (не сетку) в threejs и вообще не касаясь кватерниона тела.