PhysiJS:如何在旋转物体上的给定点获得线速度

时间:2013-02-12 22:52:01

标签: javascript 3d three.js webgl 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文档是here

由于

1 个答案:

答案 0 :(得分:0)

最后!解决了。以下是避免使用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);

}

由于在物理堆栈交换站点中回答here,我到达了上面。