Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等距三维碰撞检测_Javascript_Collision_Detection_Isometric - Fatal编程技术网

Javascript 等距三维碰撞检测

Javascript 等距三维碰撞检测,javascript,collision,detection,isometric,Javascript,Collision,Detection,Isometric,我正在为一个游戏制作一个等距图,我可以画它,但我不知道如何在没有Threejs或其他3d库的情况下实现一种3d碰撞检测 有可能吗?也许把这个块变成一个物体会有帮助?我搜索过了,但只找到了图书馆 这是我的JavaScript代码: var canvas=document.getElementById('canvas'), ctx=canvas.getContext('2d'), 宽度=画布。宽度=窗口。内部宽度, 高度=画布。高度=窗口。内部高度, 停止=错误; var-tw,th; var播放

我正在为一个游戏制作一个等距图,我可以画它,但我不知道如何在没有Threejs或其他3d库的情况下实现一种3d碰撞检测

有可能吗?也许把这个块变成一个物体会有帮助?我搜索过了,但只找到了图书馆

这是我的JavaScript代码:

var canvas=document.getElementById('canvas'),
ctx=canvas.getContext('2d'),
宽度=画布。宽度=窗口。内部宽度,
高度=画布。高度=窗口。内部高度,
停止=错误;
var-tw,th;
var播放器;
设置();
draw();
函数设置(){
ctx.平移(宽度/2,50);
tw=60;//瓷砖宽度
th=30;//瓷砖高度
玩家=新玩家(2,3,3);
};
函数绘图(){
ctx.clearRect(-宽度/2,-50,宽度*1.5,高度+50);
对于(变量i=0;i<5;i++){
对于(var j=0;j<5;j++){
牵引块(i、j、1、tw、th);
}
}
如果(!停止){
请求动画帧(绘制);
}
}
功能绘图块(x、y、z、w、h){
var top=“#eeeeee”,
右=#中交",
左=#999999';
ctx.save();
ctx.翻译((x-y)*w/2,(x+y)*h/2);
ctx.beginPath();
ctx.moveTo(0,-z*h);
ctx.lineTo(w/2,h/2-z*h);
ctx.lineTo(0,h-z*h);
ctx.lineTo(-w/2,h/2-z*h);
ctx.closePath();
ctx.fillStyle=“黑色”;
ctx.stroke();
ctx.fillStyle=顶部;
ctx.fill();
ctx.beginPath();
ctx.moveTo(-w/2,h/2-z*h);
ctx.lineTo(0,h-z*h);
ctx.lineTo(0,h);
ctx.lineTo(0,h);
ctx.lineTo(-w/2,h/2);
ctx.closePath();
ctx.fillStyle=“黑色”;
ctx.stroke();
ctx.fillStyle=左;
ctx.fill();
ctx.beginPath();
ctx.移动到(w/2,h/2-z*h);
ctx.lineTo(0,h-z*h);
ctx.lineTo(0,h);
ctx.lineTo(0,h);
ctx.lineTo(w/2,h/2);
ctx.closePath();
ctx.fillStyle=“黑色”;
ctx.stroke();
ctx.fillStyle=右;
ctx.fill();
ctx.restore();
}
函数drawTile(x、y、笔划、col){
ctx.save();
ctx.翻译((x-y)*tw/2,(x+y)*th/2);
ctx.beginPath();
ctx.moveTo(0,0);
ctx.lineTo(tw/2,th/2);
ctx.lineTo(第0位);
ctx.lineTo(-tw/2,th/2);
ctx.closePath();
如果(笔划){
ctx.stroke();
}否则{
ctx.fillStyle=col;
ctx.fill();
}
ctx.restore();
}
函数播放器(x,y,z){
这个.x=x;
这个。y=y;
这个。z=z;
this.w=10;//宽度
this.h=10;//高度
}
画布{
宽度:100%;
身高:100%;
}

您所追求的是立方体碰撞。谷歌搜索的第一个结果是一篇关于MDN的文章,名为:

从数学上来说,这看起来是这样的:

f(A,B) = (AminX <= BmaxX ∧ AmaxX >= BminX) ∧ (AminY <= BmaxY ∧ AmaxY >= BminY) ∧ (AminZ <= BmaxZ ∧ AmaxZ >= BminZ)
f(A,B)=(AminX=BminX)∧ (阿米尼=BminY)∧ (AminZ=BminZ)
在JavaScript中,我们将使用以下内容:

function intersect(a, b) {
  return (a.minX <= b.maxX && a.maxX >= b.minX) &&
         (a.minY <= b.maxY && a.maxY >= b.minY) &&
         (a.minZ <= b.maxZ && a.maxZ >= b.minZ);
}
函数相交(a,b){
返回(a.minX=b.minX)&&
(a.minY=b.minY)&&
(a.minZ=b.minZ);
}

你要找的是立方体碰撞。谷歌搜索的第一个结果是一篇关于MDN的文章,名为:

从数学上来说,这看起来是这样的:

f(A,B) = (AminX <= BmaxX ∧ AmaxX >= BminX) ∧ (AminY <= BmaxY ∧ AmaxY >= BminY) ∧ (AminZ <= BmaxZ ∧ AmaxZ >= BminZ)
f(A,B)=(AminX=BminX)∧ (阿米尼=BminY)∧ (AminZ=BminZ)
在JavaScript中,我们将使用以下内容:

function intersect(a, b) {
  return (a.minX <= b.maxX && a.maxX >= b.minX) &&
         (a.minY <= b.maxY && a.maxY >= b.minY) &&
         (a.minZ <= b.maxZ && a.maxZ >= b.minZ);
}
函数相交(a,b){
返回(a.minX=b.minX)&&
(a.minY=b.minY)&&
(a.minZ=b.minZ);
}

你所有的物体都只使用90度角吗?@destoryer是的,他们doDo你所有的物体都只使用90度角吗?@destoryer是的,他们使用