1

给定对象的线速度和角速度,如何在 PhysiJS 中查询对象点的线速度(相对于世界空间)?

为此,我正在考虑在对象上创建一个不可见的顶点,但我认为 API 甚至没有提供这种功能。我需要根据物体的平移和旋转速度自己计算吗?(如果是这样,THREE.js 或 PhysiJS 是否提供了一种直接的方式来做到这一点?)

从第一原则:

  • 给定object.position(1)
  • 给定点在世界空间中的位置object.localToWorld(point)(2)
  • 给定object.getLinearVelocity()(3)
  • 给定object.getAngularVelocity()(4)

所以我需要:

  • 从 (2) 中减去 (1) 以给出点在世界空间 (5) 中的偏移量
  • 使用 (4) 和 (5) 获得点相对于对象 (6) 的线速度
  • 将(6)和(3)相加得到点的总线速度

对于第一步和第三步,我可以使用 Three.js 的 Vector3.sub(Vector3).add(Vector3)方法,但是中间操作让我望而却步,尽管我猜想是一种乘法。鉴于 (4) 可以是欧拉角或四元数,我应该使用哪种操作?

我对矩阵的了解非常有限(而且生疏!)并且不存在四元数。

Three.js 的 API 文档在这里

谢谢

4

1 回答 1

1

最后!解决了。下面是更通用的版本,它避免了 PhysiJS。只需将三个向量替换为 PhysiJS 的向量即可。

scene.add(point2);
scene.add(pointAxis);
pointAxis.add(point);

angularVelocity = new THREE.Vector3( 0, 0, 0.01);

function animate(){

    // rotate point around pointAxis
    pointAxis.rotation = pointAxis.rotation.add(angularVelocity);

    // calculate position of point in world space
    var pointPosWorld = pointAxis.localToWorld(point.position.clone());

    // calculate position of point in world with respect to fulcrum
    var pointOffsetPos = new THREE.Vector3();
    pointOffsetPos = pointPosWorld.sub(pointAxis.position.clone());

    // Calculate tangential velocity
    tangentialVelocity = rotate.clone().cross(pointOffsetPos);

}

感谢物理堆栈交换站点中的回答,我得到了上述答案。

于 2013-02-14T15:16:09.510 回答