擅长:python、mysql、java
<p>实际上,“更好”在这里是相当主观的。在</p>
<p>你有点像谋杀四元数的概念,因为你的步长和位移都很小。根据您的应用程序,这可能实际上是可以的(游戏引擎经常利用这样的技巧来简化实时计算),但如果您的目标是准确性,或者您希望增加步长而不是得到不稳定的结果,则需要使用四元数。在</p>
<p>正如@z0r在评论中解释的那样,由于四元数通过乘法变换旋转,它们之间的“区别”就是乘法逆运算——基本上是四元数除法。在</p>
<pre><code>qinv = quaternion_inverse(q) # Using Gohlke's package
x = quaternion_multiply(q_, qinv)
</code></pre>
<p>现在,就像对于小的<code>theta</code>,<code>theta =~ sin(theta)</code>,这个<code>x</code>和减法的结果差别不大,只要差别很小。像这样滥用“小角度定理”在所有类型的模拟中经常使用,但重要的是要知道何时打破它们,以及它对模型的限制。在</p>
<p>加速度和速度仍然在增加,所以我认为这仍然有效:</p>
^{pr2}$
<p>组成单位旋转</p>
<pre><code>q_ = quaternion_multiply(q_, unit_vector(v * dt)) # update dragged quaternion
</code></pre>
<p>同样,对于小角度(即<code>dt</code>与速度相比很小),和和与乘积非常接近。在</p>
<p>如果有必要的话,像以前一样正常化。在</p>
<pre><code>q_ = unit_vector(q_)
</code></pre>
<p>我认为这应该行得通,但会比你以前的版本慢一点,可能会有非常相似的结果。在</p>