Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 四元数的增量应用_Javascript_Three.js_Game Engine_Quaternions_Cannon.js - Fatal编程技术网

Javascript 四元数的增量应用

Javascript 四元数的增量应用,javascript,three.js,game-engine,quaternions,cannon.js,Javascript,Three.js,Game Engine,Quaternions,Cannon.js,我想知道如何以多个增量进行旋转, 指向动态方向(即,我不能使用slerp) 详细信息: 我有一个三维空间中的对象,它的方向可以用四元数Q来描述。 当此对象旋转时,它会从另一台服务器接收定期更新, 它定义了真实的方向。例如,在时间t1,对象的方向 wasQ1,并收到更新,正确方向应为K1 我不能简单地用K1替换Q1,因为视觉效果会不平滑, 因此,我宁愿通过10个步骤从Q1逐步纠正到K1。 另外,我不能使用slerp,因为Q1不是静态的。相反,我想 在下一次服务器更新之前,派生一个增量修正,我称之为

我想知道如何以多个增量进行旋转, 指向动态方向(即,我不能使用slerp)

详细信息: 我有一个三维空间中的对象,它的方向可以用四元数
Q
来描述。 当此对象旋转时,它会从另一台服务器接收定期更新, 它定义了真实的方向。例如,在时间
t1
,对象的方向 was
Q1
,并收到更新,正确方向应为
K1

我不能简单地用
K1
替换
Q1
,因为视觉效果会不平滑, 因此,我宁愿通过10个步骤从
Q1
逐步纠正到
K1
。 另外,我不能使用slerp,因为
Q1
不是静态的。相反,我想 在下一次服务器更新之前,派生一个增量修正,我称之为
dK
到了

现在,我通过以下方式导出
dK

  • delK=K1*Q1.conjugate()
  • dk=delK/10
  • 第2步实际发生的是,我将
    delK
    转换为轴+角度表示, 然后将角度除以10。然后我转换回四元数

    问题1:上述方法在数学上正确吗

    问题2:我看到的情况是,
    dk
    不是一个小的修正,可能会朝相反的方向旋转。这可能是什么原因造成的


    这是为了在JavaScript中实现客户端预测。

    您可以用“slerp朝向”解决方案取代您的10步方法:

    Q = slerp(Q, Q1, 1 - Math.pow(smoothingRatio, deltaTime)
    
    该解决方案将以与帧速率无关的方式将Q向Q1倾斜,并允许Q1是动态的。插值1秒后,到Q1的“距离”的剩余部分将是
    smoothingRatio
    。阅读更多

    如果每次更新的旋转角度大于180度,则最近的旋转轴将不同于服务器上的旋转轴。一个简单的解决方案是更频繁地发送更新,或者限制对象的旋转速度

    如果将角速度与更新一起发送,则可以更好地进行客户端预测,并可能绕过“反向”问题。这个想法是沿着上次更新中发送的角速度继续旋转四元数

    Cannon.js中的函数实现了四元数集成,您可以使用它

    // Rotate Q along the angular velocity provided in the last update
    Q = Q.integrate(angularVelocity, deltaTime, Vec3.ZERO);
    

    在当前位置Q1和目标旋转K1之间使用具有预定义权重的Slerp。我认为您只需要一个动画来平滑方向更新。试试anime.js怎么样?