THREE中怎么判断一个点在扇形内

152 阅读1分钟

通过three.js向量Vector3点乘方法.dot()判断一个点(物体)是否在人前方的扇形范围内。 已知条件如图中的坐标

余弦值的规律 -90到90度角度越小cos值越大,因此cos的值大于人到mid与人到b的cos值,且点到人的距离小于扇形的半径时则在扇形内

image.png 具体实现和相应的注释如下

 const inSector = (point)=>{
        const a = new THREE.Vector3(0, 2, 0);
        const b = new THREE.Vector3(2, 2, 0);
        const person = new THREE.Vector3(1, 0, 0);
        // 计算abMid的中点
        const abMid = a.clone().add(b).multiplyScalar(0.5);
        // abMid到person的方向向量
        const abMidToPersonDir = abMid.clone().sub(person).normalize();
        // person到a和b的夹角
        const apersonangle = a.clone().sub(person).normalize().dot(abMidToPersonDir);
        // 点到人的向量
        const pointPerson = point.clone().sub(person);
        let ins = false;
        // 半径长度
        const r = abMid.clone().sub(person).length();
        // 点到人的长度
        const pointlength = pointPerson.length();
        // 如果点到人的长度大于半径长度,则不在扇形内
        if(pointlength > r){
            ins = false;
        }else{
            // 点乘返回的是cos,cos的特性扇形夹角小于180是
            const angle = pointPerson.clone().normalize().dot(abMidToPersonDir);
            if(angle > apersonangle){
                ins = true;
            }else{
                ins = false;
            }
        }
        return ins;
    }
    console.log(inSector(new THREE.Vector3(1,3,0)))