线段与三角网格求交点

空间线段三角网格交点求解思路:

1.空间线段和三角面片求交点的思路是先用线段的向量和三角形所在平面的法矢点乘求解是否和面片平行,需要排除线段所在直线和三角形所在平面平行的情况。

2.其实只要两者不平行,直线三角形所在面片的平面肯定会有交点,所以这边需要判断交点是否在线段上。

3.最后还得判断算出来的交点是否落在三角平面的内部,这边可以用面积法或者向量法求解。

情况一,直线和三角形平行或者共面的情况

情况二,直线和平面相交,交点M在直线和平面上,但是并不在线段上

情况三,线段和平面相交,交点M在线段和平面上,但是并不在三角形内部

情况四,线段和平面相交,交点M在线段和平面上,并在三角形内部

附上代码:

bool intersectSegmentTriangle(vec sp, vec sq, vec a, vec b, vec c, float t)
{
	vec qp = sp - sq;
	
	vec ab = b - a;
	
	vec ac = c - a;
	
	vec norm = ab CROSS ac;
	
	float d = qp DOT norm;
	if (d==0.0f)
	{
		return false;
	}
	if (d>0)
	{
		vec ap = sp - a;
		
		t = ap DOT norm;
		if (t < 0.0f)
		{
			return false;
		}
		if (t > d)
		{
			return false;
		}

		vec e = qp CROSS ap;
	
		float v = ac DOT e;
		if (v<0.0f || v>d)
		{
			return false;
		}
		float w = -1 * (ab DOT e);
		if (w<0.0f || v + w>d)
		{
			return false;
		}
	}
	else
	{
		vec ap = sp - a;
		
		t =-( ap DOT norm);
		if (t < 0.0f)
		{
			return false;
		}
		if (t > -d)
		{
			return false;
		}

		vec e = qp CROSS ap;
		
		float v = -(ac DOT e);
		if (v<0.0f || v>-d)
		{
			return false;
		}
		float w = 1 * (ab DOT e);
		if (w<0.0f || v + w>-d)
		{
			return false;
		}
		d = -d;
	}
	t /= d;
	float x = sp[0] + t*(sq[0]-  sp[0]);
	float y = sp[1] + t*(sq[1] - sp[1]);
	float z = sp[2] + t*(sq[2] - sp[2]);
	saveIntersectPlane.push_back(vec(x, y, z));
	return true;
}

 最后附上测试之后的案例:效果还是挺鲁棒,交点确实都找到了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LV小猪精

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值