Перемещение объекта cannonJS в 3D в соответствии с его кватернионом
Я хотел бы достичь космического корабля, как двигаться на корпусе пушки. (Я действительно новичок) Я нашел несколько примеров, но ни один из них не является тем, что я ищу.
Как я знаю, правильный способ перемещения объекта - это изменение его скорости.
Вот что я сделал здесь: http://codepen.io/Tomo0613/pen/xVjqqK enter code here
Но у меня определенно есть проблемы с пониманием кватернионов.
Есть ли способ обновить вектор тела в соответствии с его кватернионом при его вращении, или это всегда связано с миром? В результате: когда тело ускоряется только по оси Z, оно всегда будет двигаться в направлении, к которому оно обращено.
2 ответа
Скорость на Теле всегда в мировых координатах. В этом случае вы, вероятно, хотите отслеживать локальную скорость (например, vec(0,0,+1)
) в переменной, а затем преобразовать ее в мировую скорость и применить ее к телу при каждом изменении вращения.
var localVelocity = new CANNON.Vec3(0, 0, 1);
var worldVelocity = body.quaternion.vmult(localVelocity);
body.velocity.copy(worldVelocity);
Или более быстрая, но сложная для чтения версия того же кода:
var localVelocity = new CANNON.Vec3(0, 0, 1);
body.quaternion.vmult(localVelocity, body.velocity);
Возможно, я что-то упустил, но принятый ответ, кажется, отвечает на другой вопрос.
Для меня ускорение вперед было таким же простым, как сделать это:
const enginePower = new CANNON.Vec3(0, 0, 500); // engine strength
const origin = new CANNON.Vec3(0, 0, 0); // where the ship is pushed from
physicsBody.applyLocalImpulse(enginePower, origin); // push it "forward"
Обратите внимание, что мой корабль указывает в направлении z после импорта, поэтому сила (500) находится на z. Возможно, вам придется изменить свое в зависимости от направления «вперед» вашего собственного корабля. Когда ваш корабль вращается в мире, это направление «вперед» не меняется относительно корабля (но меняется относительно мира), поэтому все должно работать стабильно.
Для вращения вы можете сделать что-то вроде этого:
const turnLeft = new CANNON.Vec3(0, 2500, 0); // yaw, left
const turnRight = new CANNON.Vec3(0, -2500, 0); // yaw, right
// etc..
physicsBody.applyTorque(turnLeft);
В качестве бонуса, если вам нужна постоянная максимальная скорость, не слишком беспокоясь о реализме, вы можете добавить к своему телу линейные и угловые демпферы. Обратите внимание, что это может потребовать увеличения двигателя и крутящего момента, в зависимости от вашего вкуса.
physicsBody.linearDamping = 0.9;
physicsBody.angularDamping = 0.9;