本帖最后由 爱吃带鱼 于 2023-11-13 18:39 编辑
左边还是右边
还记的我们在第一篇讨论的前后问题么?
现在,到了该讨论左还是右的问题了!
(红圆表示路径点,黑块表示玩家位置在两个路径点构成的线段上的‘投影’点)
要解决这个问题,我们需要使用到数学方法叉乘。基础思路同样是需要两个向量:
现在我们就能用叉积的结果来判断第一个向量是在第二个向量的左边还是右边了,代码如下:
/**
* 判断B对象是否在A对象右边
* @param a
* @param b
* @returns
*/
function isEntityTurnRightFromAnother(a: mw.Transform, b: mw.Transform) {
// 你的前向量
const youForward = a.getForwardVector();
// 你到目标之间的向量
const youToTarget = b.position.clone().subtract(a.position);
// 两个向量的叉积
// 大家可以画一画这里叉乘出来的结果是指向哪个方向
const crossProduct = mw.Vector.cross(youForward, youToTarget);
const dotProduct = mw.Vector.dot(crossProduct, a.position);
if (dotProduct > 0) {
// 在右边
return true;
}
// 在左边
return false;
}
当然,我们也有另外一种更简单的方案,只需要使用到点乘即可。前提是,我们需要提前知道你的当前朝向的右方向,请看下面的代码:
<pre class="ace-line ace-line old-record-id-Q06Eds6CGoCCWwxy2IJcLyURnTb"><code class="language-TypeScript" data-wrap="false"> /**
* 判断B对象是否在A对象左边
* @param a
* @param b
* @returns
*/
function isEntityTurnRightFromAnotherWithDot(a: mw.Transform, b: mw.Transform) {
// 你的当前朝向的右方向向量
const youRightDir = a.getRightVector();
// 你到目标之间的向量
const youToTarget = b.position.clone().subtract(a.position);
// 两个向量的点乘结果
const dotProduct = mw.Vector.dot(youRightDir, youToTarget);
if (dotProduct > 0) {
// 在右边
return true;
}
// 在坐标
return false;
}</code></pre><div class="ace-line ace-line old-record-id-UMmIdKCgUo6aMmxmCDdcljm4nxg"></div>
课后小测:
我们上面介绍了如何判断位置是在左边和右边,而且分别介绍了两种不同的计算方式。
那么,请用点乘的计算方式完成下面的代码,假设A物体当前朝向一个方向,且存在一个B方向向量,请用代码计算出A物体想要转向成B方向时,该向左边旋转还是右边旋转
/**
* 判断A物体转向B方向是需要顺时针旋转(朝右旋转)还是逆时针(朝左)旋转
*/
shouldTurnClockwise(a: Core.GameObject, b: Type.Vector):boolean{
}
|