以下是一个Unity脚本示例,用于判断射线和线段是否相交并返回交点:

using UnityEngine;

public class RaySegmentIntersection : MonoBehaviour
{
    public Transform startPoint;
    public Transform endPoint;
    public Transform rayOrigin;

    private void Update()
    {
        // 创建一条射线,以rayOrigin的位置和方向
        Ray ray = new Ray(rayOrigin.position, rayOrigin.forward);

        // 创建一个平面,以startPoint和endPoint确定的线段为法线
        Plane plane = new Plane((endPoint.position - startPoint.position).normalized, startPoint.position);

        float enter;
        Vector3 intersectionPoint;

        // 判断射线和平面是否相交
        if (plane.Raycast(ray, out enter))
        {
            // 计算交点
            intersectionPoint = ray.GetPoint(enter);

            // 判断交点是否在线段上
            if (IsPointOnSegment(intersectionPoint, startPoint.position, endPoint.position))
            {
                Debug.Log("射线和线段相交,交点位置:" + intersectionPoint);
            }
            else
            {
                Debug.Log("射线和线段不相交");
            }
        }
        else
        {
            Debug.Log("射线和平面不相交");
        }
    }

    // 判断点是否在线段上
    private bool IsPointOnSegment(Vector3 point, Vector3 segmentStart, Vector3 segmentEnd)
    {
        float distance = Vector3.Distance(segmentStart, segmentEnd);
        float distanceToPoint = Vector3.Distance(segmentStart, point) + Vector3.Distance(point, segmentEnd);
        return Mathf.Approximately(distance, distanceToPoint);
    }
}

在Unity中,将此脚本附加到一个GameObject上,并将startPoint、endPoint和rayOrigin设置为相应的Transform对象。在Update函数中,将会判断射线和线段是否相交,并在控制台上打印出交点的位置


原文地址: http://www.cveoy.top/t/topic/iZs4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录