Похоже, что вы используете абсолютное значение вращения вместо изменения вращения.Например, рассмотрим следующий сценарий:
- Поворот1: 12 °
- Поворот2: 10 °
- Поворот3: 5 °
Умножая кватернионы, ваш объект поворачивается на 12 °, затем на 22 °, а затем, наконец, на 27 °, даже если вы поворачиваете назад к 0. Это происходит потому, что вы добавляете новое вращение к последнему вращению каждого события.
Что вам нужно сделать, это сохранить предыдущее значение поворота и вычесть его из нового, чтобы получить дельту поворота:
var previousRot = 0;
var newRot = 0;
rotateObject3D(e) {
newRot = e.rotation - previousRot;
// You could use newRot for your quaternion calculations
// but modifying .rotation.y is simpler
myObject.rotation.y += newRot
// Save value to be used on next event
previousRot = newRot;
}
При использовании этого метода приведенный выше сценарий даст вам изменение в ротации.Ваш объект будет сначала вращаться на + 12 °, затем на -2 °, затем на -5 °, для более естественного поведения.
Просто обязательно сбросьте previousRot = 0
на событии HammerJS 'rotateend
, чтобы вы не использовали значение из предыдущих жестов при запуске нового.