THREE.js - Quaternion Offset / Calibration - PullRequest
       27

THREE.js - Quaternion Offset / Calibration

0 голосов
/ 04 сентября 2018

Я работаю с датчиком для управления вращением модели руки в ТРИ. Я хочу иметь возможность применить смещение (при нажатии кнопки) к модели руки, чтобы скорректировать любые начальные расхождения положения датчика.

Я использую кватернионы, и я не совсем понимаю, как это сделать.

Похоже, что подход должен заключаться в том, чтобы получить текущую позицию, получить разницу между текущей позицией и исходной позицией [0,0,0,1] и применить это смещение к значениям датчика в реальном времени.

Я пробовал это до сих пор:

// on button click 
quaternionOffset.copy(quaternion.multiplyQuaternions(quaternion.inverse(), startPosition))
// on update
quaternion.multiply(quaternionOffset)

start
исходное положение датчика (пример)

start
исходное положение (пальцы направлены вперед)

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 23 марта 2019
let baseQuaternion = new THREE.Quaternion();
let diff;

function changeHandler(value) {
  if (!diff) {
    diff = baseQuaternion.multiply(value.inverse());
  }
  let calibrated = new THREE.Quaternion();
  calibrated.multiplyQuaternions(diff, value);
  object.setRotationFromQuaternion(calibrated);
}

Вдохновлен https://stackoverflow.com/a/22167097/1162838

0 голосов
/ 05 сентября 2018

Я думаю, что ваш подход правильный, просто убедитесь, что вы случайно не применили домашний кватернион внутри входного кватерниона:

var inputQuaternion = new THREE.Quaternion();
var homeQuaternion = new THREE.Quaternion();

document.addEventListener('click', function () {
  // set the current rotation as home
  homeQuaternion.copy(inputQuaternion).inverse();
});

function updateFromSensor(quaternion) {
  inputQuaternion.copy(quaternion);
  object.quaternion.multiplyQuaternions(inputQuaternion, homeQuaternion);
}
...