Перемещение объекта 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;
Другие вопросы по тегам