此函数在在RecastNavigation源码中,用于判断三角形倾角是否超过最大可行走角度,未超过的则标记为可行走。
void rcMarkWalkableTriangles(rcContext* ctx, const float walkableSlopeAngle,
const float* verts, int nv,
const int* tris, int nt,
unsigned char* areas)
{
rcIgnoreUnused(ctx);
rcIgnoreUnused(nv);
const float walkableThr = cosf(walkableSlopeAngle/180.0f*RC_PI);
float norm[3];
for (int i = 0; i < nt; ++i)
{
const int* tri = &tris[i*3];
calcTriNormal(&verts[tri[0]*3], &verts[tri[1]*3], &verts[tri[2]*3], norm);
// Check if the face is walkable.
if (norm[1] > walkableThr)
areas[i] = RC_WALKABLE_AREA;
}
}
walkableSlopAngle是面最大可行走倾角
calcTriNormal首先计算三角形面的法线,保存在norm中,并且法线向量的模为1,计算法线的方法可参考点积和叉积的几何意义_GatyFly的博客-CSDN博客
法线向量的norm[1]代表了法线的y分量,那代码中为什么通过比较norm[1] > walkableThr就标志着这个三角形是可行走的?画个图就理解了
如上图所示,设此三角形面的倾角是, 法线是
, 则通过简单的三角形原理,可知道
与 的竖直方向分量夹角也是
,则
可知,就是法向量的y分量,也就是代码中的norm[1]
所以 < walkableSlopAngle, 此时代表此三角形是可行走的。