向动态位置移动 Cannon.JS Body?
Move Cannon.JS Body Toward Dynamic Position?
我很难思考如何做到这一点。
我正在尝试做的是通过速度将物理 body 移动到另一个 body,直到它到达并击中所述 body。 (想想 AI 跟随玩家)
一种解决方案如下:
body.velocity.x = target.position.x-body.position.x;
body.velocity.z = target.position.z-body.position.z;
不过这有问题。一个是速度更高,这取决于两个物体之间的距离。我更喜欢固定速度。另一种方法是使用以下示例:
但在这种情况下,我需要一种旋转四元数的方法,使其面向目标位置,这只需要知道物体的两个位置。
所以问题是,我如何计算body的速度或方向,以便它可以通过使用固定的speed/velocity跟随并与目标body碰撞]?
要获得固定速度,.normalize()
您的速度矢量,然后按您想要的速度缩放 (.mult()
) 结果。结果将是一个始终具有您想要的长度的向量。
要获得使您的 body 朝向特定方向的四元数,您可以使用 Quaternion.setFromVectors(u,v)
。此方法创建一个四元数,它将旋转 u
,因此它指向与 v
相同的方向。如果您将 u
设置为您的前向向量,并将 v
设置为您希望 body 观察的方向,您将获得正确的 "look at" 行为。请注意,"forward" 向量可能因您的游戏而异。
// Compute direction to target
var direction = new CANNON.Vec3();
target.position.vsub(body.position, direction);
direction.y = 0;
direction.normalize();
// Get the rotation between the forward vector and the direction vector
var forward = new CANNON.Vec3(0,0,1);
body.quaternion.setFromVectors(forward, direction);
// Multiply direction by 10 and store in body.velocity
var fixedSpeed = 10;
direction.mult(fixedSpeed,body.velocity);
我很难思考如何做到这一点。 我正在尝试做的是通过速度将物理 body 移动到另一个 body,直到它到达并击中所述 body。 (想想 AI 跟随玩家)
一种解决方案如下:
body.velocity.x = target.position.x-body.position.x;
body.velocity.z = target.position.z-body.position.z;
不过这有问题。一个是速度更高,这取决于两个物体之间的距离。我更喜欢固定速度。另一种方法是使用以下示例:
但在这种情况下,我需要一种旋转四元数的方法,使其面向目标位置,这只需要知道物体的两个位置。
所以问题是,我如何计算body的速度或方向,以便它可以通过使用固定的speed/velocity跟随并与目标body碰撞]?
要获得固定速度,.normalize()
您的速度矢量,然后按您想要的速度缩放 (.mult()
) 结果。结果将是一个始终具有您想要的长度的向量。
要获得使您的 body 朝向特定方向的四元数,您可以使用 Quaternion.setFromVectors(u,v)
。此方法创建一个四元数,它将旋转 u
,因此它指向与 v
相同的方向。如果您将 u
设置为您的前向向量,并将 v
设置为您希望 body 观察的方向,您将获得正确的 "look at" 行为。请注意,"forward" 向量可能因您的游戏而异。
// Compute direction to target
var direction = new CANNON.Vec3();
target.position.vsub(body.position, direction);
direction.y = 0;
direction.normalize();
// Get the rotation between the forward vector and the direction vector
var forward = new CANNON.Vec3(0,0,1);
body.quaternion.setFromVectors(forward, direction);
// Multiply direction by 10 and store in body.velocity
var fixedSpeed = 10;
direction.mult(fixedSpeed,body.velocity);