【问题标题】:THREE.js - Quaternion Offset / CalibrationTHREE.js - 四元数偏移/校准
【发布时间】:2023-04-10 23:07:02
【问题描述】:

我正在使用传感器来控制手模型在三中的旋转。我希望能够对手模型应用偏移(在按钮单击时),以针对任何初始传感器位置差异进行调整。

我正在使用四元数,但我并不完全清楚如何做到这一点。

似乎方法应该是获取当前位置,获取当前位置与起始位置[0,0,0,1]之间的差异,并将此偏移量应用于实时传感器值。

到目前为止我已经尝试过了:

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


初始传感器位置(示例)


原位(手指指向前方)

感谢您的帮助

【问题讨论】:

    标签: three.js quaternions


    【解决方案1】:

    我认为你的方法是正确的,只要确保你不会不小心在输入四元数内应用主四元数:

    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);
    }
    

    【讨论】:

    • 谢谢,上面的解决方案仍然没有产生我想要的结果。例如,当应用上述操作时,手模型移动到四元数的共轭/逆。 i.imgur.com/ktisBJj.png 我想我在获取模型的当前位置、获取该位置与原始位置 (0,0,0,1) 之间的差异以及从该差异中获取偏移量方面遗漏了一些东西。我只是不确定如何使用四元数。
    • 你能上传一张静止姿势的手模型截图吗? (无旋转)
    【解决方案2】:
    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-13
      • 2018-12-20
      • 2017-09-06
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多