[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;
}
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;
}
没有找到相关结果
已邀请:
要回复问题请先登录
1 个回复
132*****097
赞同来自: