[开发者心得] 《关于我在MetaWorld中使用TypeScript解决数学问题的二三事》

[复制链接]
1330 |4
小迷妹 发表于 2023-2-21 18:23:59 | 显示全部楼层 |阅读模式
本帖最后由 爱吃带鱼 于 2023-11-13 18:44 编辑

前面还是后面
还记得我的世界里的苦力怕嘛?他总会在你面朝其他方向时偷偷靠近你。但是苦力怕又不聪明,它是如何知道别人是面朝其他方向的呢
答案是---------数学
好吧,这样想苦力怕确实比大部分人都要来的聪明。。。
总之,请看下图,图中那个绿色的哥们儿就是想要偷偷靠近的你的人

image.png


要解决这个问题,我们需要使用到 点乘
首先,我们需要有两个向量:
1、目标距离我的方向向量
2、其次是我自己的朝向向量。
现在,我们只需要搞清楚这两个向量是否指向同一个方向即可,下面是详细的TS代码:



    /**
     * 判断B对象是否在A对象前面
     * @param a
     * @param b
     * @returns
     */
function isAnotherFrontEntity(a: mw.Transform, b: mw.Transform) {

        // 你的前向量
        const youForward = a.getForwardVector();

        // 你到敌人之间的向量
        const youToEnemy = b.position.clone().subtract(a.position);

        // 如果两个向量是相反方向,说明敌人在你后面
        const dotProduct = mw.Vector.dot(youForward, youToEnemy);

        // 对于归一化向量,向量点乘结果的几何意义如下
        // 点乘结果为1时,说明两个向量属于同一方向
        // 点乘结果为-1时,说明两个向量属于相反方向
        // 点乘结果为0时,说明两个向量垂直
        // 如果你的视野角度是90度,而且你只想知道敌人是否在前后
        // 那么你完全可以不归一化向量,毕竟归一化也需要计算消耗。
        if (dotProduct >= 0) {
            return true;
        } else {
            return false;
        }
    }





课后小测:
已知A对象和B对象的朝向、位置。求出A对象是否面向B对象

回复

使用道具 举报

暗香浮动月黄昏 发表于 2023-2-21 18:25:09 | 显示全部楼层
学到了学到了,感谢分享
回复

使用道具 举报

惊鸿ZJ7 发表于 2023-2-21 18:29:17 | 显示全部楼层
听说回复超过15个字,可以领双倍积分
回复

使用道具 举报

喵喵哭唧唧 发表于 2023-2-21 18:29:47 | 显示全部楼层
那请问大大,如果我要归一化,应该在什么时候进行归一化丫
回复

使用道具 举报

小迷妹楼主 发表于 2023-2-21 18:31:17 | 显示全部楼层
喵喵哭唧唧 发表于 2023-2-21 18:29
那请问大大,如果我要归一化,应该在什么时候进行归一化丫

在IF判断前用dotProduct.normalize()就好啦
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表