0
点赞
收藏
分享

微信扫一扫

rcMarkWalkableTriangles

Spinach菠菜 2022-03-30 阅读 7
游戏程序

此函数在在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就标志着这个三角形是可行走的?画个图就理解了

 如上图所示,设此三角形面的倾角是\theta, 法线是\vec{N}, 则通过简单的三角形原理,可知道\vec{N}

\vec{N} 的竖直方向分量夹角也是\theta,则\cos\theta = \left | \vec{N_{y}}\right | / \left | \vec{N} \right | = \left | \vec{N_{y}} \right |

 可知,\cos\theta就是法向量的y分量,也就是代码中的norm[1]

所以 \theta< walkableSlopAngle, 此时代表此三角形是可行走的。

举报
0 条评论