数学渣渣求教如何实现 NPC 尾行 Player 的效果

不考虑任何有关障碍物与寻路的问题,就是在一个完全开放的3D场景中实现玩家操作 Player 进行平面移动,NPC角色实现逐帧判断 Player 的位置,随后自我旋转,同时朝 Player 移动。

移动的问题好解决,通过 rigidBody.setLinearVelocity 沿 forward 方向设置一个速度就可以了。
关键是转向,不希望通过 Node.lookAt 来调整 NPC 的朝向,因为需求是 NPC 的转向速度比 Player 的要慢,而直线速度 NPC 比 Player 快,所以需要用 rotate 的方式来调整 NPC 的朝向。

数学渣渣思考需求,表示不知如何利用现有 API 实现这个需求,求助大神帮忙!谢谢!

npc的朝向可以算一个向量,然后player与npc这两点算一个向量,计算两个向量的夹角,然后就可以旋转了

`

    const distance = Vec3.subtract(_tempVC, this.node.worldPosition, this._player.worldPosition);
    const forward = this.node.forward;

    const target = new Vec2(distance.x, distance.z);
    const self = new Vec2(forward.x, forward.z);

    var angle = target.signAngle(self);

    this.node.rotate(Quat.fromEuler(_tempQuat, 0, this.rotateSpeed * deltaTime * (angle <= 0 ? 1 : -1), 0));`

感谢!!!

目前是这样做的,之所以转成 Vec2 是因为想利用 signAngle 这个 API 获得带符号的夹角,这样比较方便操作旋转的方向。正好按目前的需求角色在Y轴方向始终是0。
如果有更好的写法,还请朋友们提供一下。