计算两条直线最近位置的点

21 篇文章 1 订阅
文章介绍了如何使用C#的Ray类在Unity中进行直线之间的最小距离点查找,包括判断直线平行、计算交点的方法,以及`GetLineMinDistPoints`和`GetLinePlaneIntersectPoint`函数的实现。
摘要由CSDN通过智能技术生成

代码为C#版本(其中的直线使用了Ray射线类来代替),在Unity中测试通过。

参考如下:

//返回第一条射线上的点。
Vector3 GetLineMinDistPoint1(Ray ray1, Ray ray2)
{
	Vector3 p1 = ray1.origin;
	Vector3 p2 = ray2.origin;
	Vector3 d1 = ray1.direction;
	Vector3 d2 = ray2.direction;

	Vector3 n = Vector3.Cross(d1, d2);

	// 方向向量叉乘为零,表示直线平行或重合
	if (Mathf.Approximately(n.magnitude, 0))
	{
		// 平行或重合的情况
		return p1;
	}
	else
	{
		// 不平行的情况
		Vector3 cross1 = Vector3.Cross(d1, d2);
		return GetLinePlaneIntersectPoint(p1, d1, p2, Vector3.Cross(d2, cross1).normalized);
	}
}

//输出两条射线上的两个点,返回值为true是平行,false为不平行
bool GetLineMinDistPoints(Ray ray1, Ray ray2, out Vector3 point1, out Vector3 point2)
{
	Vector3 p1 = ray1.origin;
	Vector3 p2 = ray2.origin;
	Vector3 d1 = ray1.direction;
	Vector3 d2 = ray2.direction;

	Vector3 n = Vector3.Cross(d1, d2);

	// 方向向量叉乘为零,表示直线平行或重合
	if (Mathf.Approximately(n.magnitude, 0))
	{
		// 平行或重合的情况
		point1 = p1;
		point2 = p2;
		return true;
	}
	else
	{
		// 不平行的情况
		Vector3 cross = Vector3.Cross(d1, d2);
		point1 = GetLinePlaneIntersectPoint(p1, d1, p2, Vector3.Cross(d2, cross).normalized);
		point2 = GetLinePlaneIntersectPoint(p2, d2, p1, Vector3.Cross(d1, cross).normalized);
		return false;
	}
}

//线和平面的交点
Vector3 GetLinePlaneIntersectPoint(Vector3 rayPoint, Vector3 rayDirection, Vector3 planePoint, Vector3 planeNormal)
{
	float d = Vector3.Dot(planePoint - rayPoint, planeNormal) / Vector3.Dot(rayDirection, planeNormal);
	return d * rayDirection + rayPoint;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值