[0]点沿着多边形移动

 //点沿着多边形运动
    pointInPolygon(cp,p,polygon)  // cp是当前位置,p是上一帧的位置,polygon是障碍物,子节点有"Cube" 描出凸多边形边界
    {
        let arr = [];
        let arr2 = [];
        let j = 0;
        for(let i=0;i<polygon.numChildren;++i)
        {
            let t = polygon.getChildAt(i);
            if(t.name == "Cube")
            {
                let pos = t.transform.position.clone();
                Laya.Vector3.subtract(pos,cp,pos);
                arr[j] = pos.clone(); 
                pos = t.transform.position.clone();
                Laya.Vector3.subtract(pos,p,pos);
                arr2[j] = pos.clone();
                j++;
            }
        } 
        let len = arr.length;
        let sum = 0;
        let indexArr1 = [];
        let indexArr2 = [];
        for(let i=0;i<len;++i)
        {
            let pos1 = arr[i].clone();
            let pos2 = arr[(i+1)%len].clone();
            if(pos1.x * pos2.z - pos1.z * pos2.x > 0)
            {
                sum += 1;
                indexArr1[i] = 1;
            }
            else 
            {
                sum -= 1;
                indexArr1[i] = -1;
            } 
            pos1 = arr2[i].clone();
            pos2 = arr2[(i+1)%len].clone();
            if(pos1.x * pos2.z - pos1.z * pos2.x > 0)
            {
                indexArr2[i] = 1;
            }
            else 
            {
                indexArr2[i] = -1;
            }
        } 
        if(sum == len || sum == -len)
        {
            for(let i=0;i<len;++i)
            {
                if(indexArr1[i]*indexArr2[i]<0)
                {
                    let pos1 = arr[i].clone();
                    let pos2 = arr[(i+1)%len].clone();
                    let pos3 = arr[i].clone();
                    let pos4 = arr[i].clone(); 
                    Laya.Vector3.add(pos1,cp,pos1);
                    Laya.Vector3.add(pos2,cp,pos2);
                    if(Math.max(pos1.x,pos2.x)<Math.min(p.x,cp.x) || Math.min(pos1.x,pos2.x)>Math.max(p.x,cp.x) ||
                        Math.max(pos1.z,pos2.z)<Math.min(p.z,cp.z) || Math.min(pos1.z,pos2.z)>Math.max(p.z,cp.z))
                    {
                        continue;
                    }
                    Laya.Vector3.subtract(cp,p,pos3);
                    Laya.Vector3.subtract(pos2,pos1,pos4); 
                    Laya.Vector3.normalize(pos4,pos4);
                    let scale = Laya.Vector3.dot(pos4,pos3);
                    Laya.Vector3.scale(pos4,scale,pos4);
                    Laya.Vector3.add(p,pos4,p);
                    p.y = cp.y;
                    this.Object.transform.position = p.clone();
                    return true;
                }
            }
            this.Object.transform.position = p.clone();
        }
        return false;
    }
已邀请:

132*****097

赞同来自:

请问这个cube是怎么做呢?unity默认的cube导出就可以吗?

要回复问题请先

商务合作
商务合作