斜坡上的碰撞检查
|
我正在开发一款新游戏,并且正在尝试根据相对于坡度坐标的坐标来检测玩家(在坡度上)是否与给定的网格物体发生碰撞。我正在使用此功能,该功能似乎无效(坡度似乎太小或其他什么)
//Slopes
float slopeY = max.Y-min.Y;
float slopeZ = max.Z-min.Z;
float slopeX = max.X-min.X;
float angle = (float)Math.Atan(slopeZ/slopeY);
//Console.WriteLine(OpenTK.Math.Functions.RadiansToDegrees((float)Math.Atan(slopeZ/slopeY)).ToString()+\" degrees incline\");
slopeY = slopeY/slopeZ;
float slopeZX = slopeY/slopeX;
//End slopes
float surfaceposX = max.X-coord.X;
float surfaceposY = max.Y-coord.Y;
float surfaceposZ = min.Z-coord.Z;
min-=sval;
max+=sval;
//Surface coords
//End surface coords
//Y SHOULD = mx+b, where M = slope and X = surfacepos, and B = surfaceposZ
if(coord.X<max.X& coord.X>min.X&coord.Y>min.Y&coord.Y<max.Y&coord.Z>min.Z&coord.Z<max.Z) {
if(slopeY !=0) {
Console.WriteLine(\"Slope = \"+slopeY.ToString()+\"SlopeZX=\"+slopeZX.ToString()+\" surfaceposZ=\"+surfaceposZ.ToString());
Console.WriteLine(surfaceposY-(surfaceposY*slopeY));
//System.Threading.Thread.Sleep(40000);
if(surfaceposY-(surfaceposZ*slopeY)<3 || surfaceposY-(surfaceposX*slopeZX)<3) {
return true;
} else {
return false;
}
} else {
return true;
}
} else {
return false;
}
有什么建议么?
样本输出:
59.86697
6.225558 2761.331
68.3019度倾斜
59.86698,46.12445
59.86698
6.225558 2761.332
0度倾斜
编辑:部分解决了问题。斜坡检测有效,但是现在我可以穿过墙壁了???
//Slopes
float slopeY = max.Y-min.Y;
float slopeZ = max.Z-min.Z;
float slopeX = max.X-min.X;
float angle = (float)Math.Atan(slopeZ/slopeY);
//Console.WriteLine(OpenTK.Math.Functions.RadiansToDegrees((float)Math.Atan(slopeZ/slopeY)).ToString()+\" degrees incline\");
slopeY = slopeY/slopeZ;
float slopey = slopeY+1/slopeZ;
float slopeZX = slopeY/slopeX;
//End slopes
float surfaceposX = min.X-coord.X;
float surfaceposY = max.Y-coord.Y;
float surfaceposZ = min.Z-coord.Z;
min-=sval;
max+=sval;
//Surface coords
//End surface coords
//Y SHOULD = mx+b, where M = slope and X = surfacepos, and B = surfaceposZ
if(coord.X<max.X& coord.X>min.X&coord.Y>min.Y&coord.Y<max.Y&coord.Z>min.Z&coord.Z<max.Z) {
if(slopeY !=0) {
Console.WriteLine(\"Slope = \"+slopeY.ToString()+\"SlopeZX=\"+slopeZX.ToString()+\" surfaceposZ=\"+surfaceposZ.ToString());
Console.WriteLine(surfaceposY-(surfaceposY*slopeY));
//System.Threading.Thread.Sleep(40000);
surfaceposZ = Math.Abs(surfaceposZ);
if(surfaceposY>(surfaceposZ*slopeY) & surfaceposY-2<(surfaceposZ*slopeY) || surfaceposY>(surfaceposX*slopeZX) & surfaceposY-2<(surfaceposX*slopeZX)) {
return true;
} else {
return false;
}
} else {
return true;
}
} else {
return false;
}
没有找到相关结果
已邀请:
1 个回复
澳绍能
从网格中选择一个“分区”平面(面),将其余的网格大致分为两部分。这对于复杂的几何图形而言要容易得多,因为完全凸出的项目(球体等)趋向于像列表而不是树。 从定义分区平面的顶点创建一个新的“ 3”实例。 将剩余的面分为两个列表-一个在分区平面的前面,另一个包含后面的面。 递归到步骤2,直到列表中没有更多节点为止。 检查碰撞时,有两个选择。 单点:通过调用根节点的ѭ4来检查角色或对象相对于树的坐标,如果该方法返回false,则目标点位于网格的“内部”,并且您已经相撞。如果该方法返回true,则目标点为网格的“外部”,并且没有发生碰撞。 射线相交。这个有点棘手。用对象的当前位置和目标位置调用根节点的“ 5”方法。如果方法返回“ 6”,则在两个位置之间移动将在网格中过渡。这是一种高级检查(尽管更为复杂),因为它可以捕获边缘情况,例如所需的移动将使一个步骤中的对象完全通过对象时。 我只是迅速地将这些示例代码放在一起。它不完整,甚至可能无法编译,但是它应该使您朝着正确的方向前进。 关于BSP的另一件好事:使用
方法,您可以确定地图上的一个点是否可以从另一点看到。一些游戏使用它来确定NPC / AI是否可以看到对方或真正的玩家。您可以对此稍作修改,以确定他们是否可以听到彼此的走动等。 这似乎比您原来的方法要复杂得多,但最终它会变得更加强大和灵活。值得您花时间进行调查。