线线相交 (Unity代码)

物体移出镜头外出现ui提示 ps:刚好项目要实现这个功能,翻了翻网上没有找到相关文章,自己就写了一个,有什么更好的建议还请多指教 实现思路: 1、检测物体是否移出屏幕外       这部分unity有现成API,OnBecameVisible,与OnBecameInvisible. 这两个函数可以检测,但脚本要挂在检测的物体上,物体要有render组件 2、确定ui边缘位置       物体世界坐标转为屏幕 阅读详情

 

using UnityEngine;

using System.Collections;

 

public enum LineIntersectType

{

    None = -1,//没有交点

    OnBothExtend = 0,//在两条直线的延长线上

    OnFirstLine = 1,//在第一条直线上 p0-p1

    OnSecondLine = 2,//在第二条直线上 p2-p3

    OnBothLine = 3//在第两条直线上

}

 

public static class ToolsMathUnity

{

 

    /// <summary>

    /// 判断两个浮点数字是否相等

    /// 注意,不能用该函数判断浮点数是否为0.应用IsZero

    /// </summary>

    /// <param name="r1"></param>

    /// <param name="r2"></param>

    /// <param name="tolerance">精度</param>

    /// <returns></returns>

    public static bool IsRealEqual(float r1, float r2, float tolerance)

    {

        if (Mathf.Abs(r2) <= tolerance)

        {

            if (r1 > tolerance)

            {

                return false;

            }

        }

        else

        {

            if (Mathf.Abs(r1 / r2) - 1.0 > tolerance)

            {

                return false;

            }

        }

        return true;

    }

 

    public static bool IsRealEqual(float r1, float r2)

    {

        float tolerance = GlobalVariables._realTolerance;

        if (Mathf.Abs(r2) <= tolerance)

        {

            if (r1 > tolerance)

            {

                return false;

            }

        }

        else

        {

            if (Mathf.Abs(r1 / r2) - 1.0 > tolerance)

            {

                return false;

            }

        }

        return true;

    }

 

    public static bool IsZero(float r, float tolerance)

    {

        return (r <= tolerance && r >= -tolerance) ? true : false;

    }

 

    public static bool IsZero(float r)

    {

        float tolerance = GlobalVariables._realTolerance;

        return (r <= tolerance && r >= -tolerance) ? true : false;

    }

 

     public static LineIntersectType LineXLine(Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3, ref Vector2 xpt)

    {

        /*

        **  Get the intersection of the line defined by p0 and p1 with the

        **  line defined by p2 and p3.  Sets xpt to the intersection point

        **  if return value is non-negative. 

        **

        **  Returns:

        **       None = Lines are paralell or the points are the same.

        **       OnBothExtend = Intersection is not on either segment.

        **       OnFirstLine = Intersection is on the 1st segment (p0-p1) but not the 2nd.

        **       OnSecondLine = Intersection is on the 2nd segment (p2-p3) but not the 1st.

        **       OnBothLine = Intersection is on both line segments.

        */

        float a1 = p1.y - p0.y;

        float b1 = p0.x - p1.x;

        float c1 = a1 * p0.x + b1 * p0.y;

 

        float a2 = p3.y - p2.y;

        float b2 = p2.x - p3.x;

        float c2 = a2 * p2.x + b2 * p2.y;

 

        float denominator = a1 * b2 - a2 * b1;

        if (IsZero(denominator))

        {

            //paralell

            return LineIntersectType.None;

        }

        else

        {

            int on1 = 1;

            int on2 = 1;

 

            xpt.x = (b2 * c1 - b1 * c2) / denominator;

            xpt.y = (a1 * c2 - a2 * c1) / denominator;

            Vector2 vecMin = Vector2.Min(p0, p1);

            Vector2 vecMax = Vector2.Max(p0, p1);

            on1 = (vecMin.x <= xpt.x && xpt.x <= vecMax.x &&

                vecMin.y <= xpt.y && xpt.y <= vecMax.y) ? 1:0;

            vecMin = Vector2.Min(p2, p3);

            vecMax = Vector2.Max(p2, p3);

            on2 = (vecMin.x <= xpt.x && xpt.x <= vecMax.x &&

                vecMin.y <= xpt.y && xpt.y <= vecMax.y) ? 1 : 0;

            int result = on1 + 2*on2;

            if (0 == result)

            {

                return LineIntersectType.OnBothExtend;

            }

            else if (1 == result)

            {

                return LineIntersectType.OnFirstLine;

            }

            else if (2 == result)

            {

                return LineIntersectType.OnSecondLine;

            }

            else// 3==result

            {

                return LineIntersectType.OnBothLine;

            }

        }

    }

}

 

 

 

public static class GlobalVariables

{

    //private GlobalVariables()

    //{

    //    //防止实例化

    //}

    public const float _realTolerance = 1.0e-11f;

}

 

测试代码:

public class test : MonoBehaviour

{

    void Update()

    {

        if (Input.GetKeyDown(KeyCode.L))

        {

            Vector2 p0 = new Vector2(0, 0);

            Vector2 p1 = new Vector2(1, 0);

            Vector2 p2 = new Vector2(-1, 0.5f);

            Vector2 p3 = new Vector2(-1, 1);

            Vector2 xpt = new Vector2(100, 100);

            LineIntersectType lit = ToolsMathUnity.LineXLine(p0, p1, p2, p3, ref xpt);

            print(lit + ": " + xpt);

        }

    }

}

 

 

 

Unity3d数学公式之线段相交 这一篇写一下线段相交的代码 在2d游戏中可能会经常使用到 需要的朋友拿走吧 public static bool IsSegmentIntersectionWithSegment(ref Vector2 segment0Start, ref Vector2 segment0End, ref Vector2 segment1Start, ref Vector2 segment1End) 阅读详情

相关推荐

Unity取得两向量的交点

public static Vector3 GetIntersection(Vector3 lineAStart, Vector3 lineAEnd, Vector3 lineBStart, Vector3 lineBEnd) { float x1 = lineAStart.x, y1 = lineAStart.y; float x2 = lineAEnd.x, y2 = lineAEnd.y; float ...

muke199547的博客 3306

Unity 获取直线与平面的交点

/// <summary> /// 计算直线与平面的交点 /// </summary> /// <param name="point">直线上某一点</param> /// <param name="direct">直线的方向</param> /// <param name="planeNormal">垂直于平面的的向量</param> /// <pa...

qq_32184407的博客 3159

C#计算平面两条直线交点代码参考

C#计算平面两条直线交点代码参考

ttod的博客 455

Unity 计算AB与CD两条线段的交点

向量CA CD的法线V1与AB如果垂直正弦值为0,这样才共面。

qq_31456205的博客 728

线与线相交、线与矩形相交判断

/// /// 只要线与矩形有一条线有相交,则线与矩形相交 /// public class LineWithRect : MonoBehaviour { public Rect rect = new Rect(0, 0, 100, 100); public Transform LineStart; public Transform lineEnd; Vector3 VecLineStart;...

strivero的博客 8006

扫线法快速判断凹多边形相交

简介: 首先给出我的Github页面:ConcaveIntersection 这个开源库基于Unity开发,主要实现了凹多边形之间的相交判断,当然也可以应用于顶点与凹凸包、线段与凹凸包、凸包与凸包之间的相交判断,也就是说,这个方案基本可以解决前面两则文章中的所有多边形判断,效率也非常高,复杂度几乎接近O(n),下面解释原理。 一、扫线法概念 扫线法其实是一种常用的平面空间算法思路,在很多算法...

Andrew的游戏世界 4842

Unity3D绘制两圆柱体相贯线

1 相贯线   项目中需要用代码去绘制两个圆柱体相贯线,花了两天时间可算整明白怎么画了。国内有关这方面的文章不多,所以花了这么多时间,我这里总结一下,希望能够帮助到需要的同学。   相贯线就是两个立方体相交表面所形成的曲线。如何求解呢?其实就是列方程求解(对应的课程是《解析几何》或者《线性代数》)。下面我将解释如何列方程去求解两个圆柱体的相贯线(需要一些矩阵方面的知识才能深刻理解背后的原理,建议去...

老王的博客 1万+

Unity-LineSegmentsIntersection:Unity的线段交点

Unity-LineSegmentsIntersection Unity3D / C#的线段相交。 环境 Unity 2018.3.6f1 执照

【unity】三维数学应用(计算线和面的交点)

实现方法有多种,下面介绍一种简单的方法。利用一个点指向面上任意点的向量,到该面法线的投影长度相同的基本原理,结合相似三角形既可以求出交点。

发布unity,三维模型的相关内容 1579

手把手教你搭建日本亚马逊CVV钓鱼系统(含自动验证功能)

本文详细介绍了电商平台安全防护的关键实践,重点讲解了如何构建自动化风控系统。内容包括基础架构设计、用户行为分析、交易风险评估模型构建、验证机制实现以及系统部署优化,帮助电商平台有效识别和防范安全威胁,同时提升用户体验。

weixin_30952535的博客 819

从SPICE到电磁场:非线性器件在CST场路协同仿真中的建模艺术

本文深入探讨了非线性器件在CST场路协同仿真中的建模技术,重点分析了SPICE模型与电磁场仿真的集成方法。通过对比线电流模型和面电流模型的优缺点,结合实际案例展示了二极管阵列在电磁散射调控中的应用,为工程师提供了优化仿真精度与效率的实用技巧。

pandas7gardener的博客 200

Unity Shader学习:相交算法实现简易能量盾

Unity Shader学习:相交算法实现简易防能量盾 主要思路:对比物体和场景深度图在观察空间下的深度差值,深度差越小表示相交,颜色越深,在加上边缘光勾出轮廓。 shader部分: Shader "Unlit/DepthOutline" { Properties{ _MainTex("MainTex",2D) = "white"{} _RimFactor("RimFactor",Ra...

咪咪博客 1852

ABB机器人发送实时位置给PLC

本文使用中断方式实现,多任务要订购ABB功能包 Profinet总线组变量配置 注:映射为16位和32位均可用 声明数据 VAR num CurrentExAxisPos;!外轴位置 VAR robtarget pCurrentPos;!实时位置 var intnum TrapNum;!中断号 初始化开中断 IDelete TrapNum;!中断号 CONNECT TrapNum WITH iTrapCurPos;!连接中...

澍澍爸的blog 6781

Unity 判断两个UI是否相交

Unity 判断两个UI是否相交

不在同一频道上的呆子的博客 2138

绕线机的制作与研究

本文详细阐述了绕线机的制作过程,涵盖从设计规划到实际制作的各个环节。通过对绕线机工作原理的深入分析,确定了关键技术参数,并依此完成机械结构与控制系统的设计。在制作阶段,运用多种加工工艺完成零件制造与设备组装。经测试,自制绕线机性能达到预期,能够满足特定线圈绕制需求,为相关领域的生产实践与技术研究提供了参考。

道亦无名 1438

22、嵌入式软件随机延迟生成与加密算法防护技术

本文探讨了嵌入式软件中的随机延迟生成方法与块密码软件实现的高阶掩码及洗牌技术。重点介绍了浮动均值延迟生成方法,其在8位AVR平台上的实现效率为Θ(1),显著提升了抗相关功率分析(CPA)攻击的能力,相比传统方法更安全且轻量。同时,分析了高阶掩码与洗牌技术结合的方案,通过理论建模量化其对高级差分功率分析(DPA)攻击的抵抗能力,并以AES为例展示了该方案的应用流程。最后对比了不同防护技术在安全性与开销之间的权衡,为实际应用中选择合适的安全策略提供了依据。未来可进一步优化实现效率并融合多种防护手段以应对复杂安全

fern8的博客 88

OBB2D相交检测

OBB相交检测 判断2D平面上两个矩形(可以旋转)是否相交。 如果两个矩形 A、B 不相交,则存在至少一条直线能够将两个矩形分割在两侧。对于凸多边形依然成立。 能将两个矩形分割的直线叫分离线 separatingLine、垂直于分割线的直线叫分离轴 separatingAxis 如下图 如何确定是否有一条能够分割两个矩形,它又在哪里。 经过科学的证明如果存在能够将两个矩形分割的线,则至少有一条线是平行于两个矩形的一条边。 则 separatingAxis 也平行于两个矩形的某一条边。我们只需要证明这四条线

lq 3551

【OpenClaw从入门到精通】第12篇:OpenClaw 2026子代理实战全攻略:用ACP架构搭建多智能体协作网络(附完整代码)

本文聚焦OpenClaw 2026.3.2版本默认启用的ACP(Agent Communication Protocol)子代理机制,从核心概念、底层原理到企业级实操全流程拆解。先解析子代理的定义、ACP协议通信原理及主从代理分工逻辑,再提供环境准备的详细步骤(版本验证、配置调整、技能安装);随后通过三个递进式虚拟案例(客服分流、智能文档处理、企业级招聘全流程),提供可直接运行的完整代码、执行结果及技术要点解析;最后补充子代理管理运维、性能优化与避坑指南。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2385

unity 判断两个矩形是否相交

原理:两个矩形相交的条件:两个矩形的中心距离在X和轴上都小于两个矩形长或宽的一半之和. 代码如下(可直接复制粘贴使用,挂在需要判断是否相交的两个矩形中任意一个即可): /// &amp;amp;amp;amp;lt;summary&amp;amp;amp;amp;gt; /// 判断两个矩形是否相交 /// 两个矩形相交的条件:两个矩形的重心距离在X和轴上都小于两个矩形长或宽的一半之和. /// &amp;amp;amp;amp;lt;/summa

hyp19980829的博客 8282

Windows窗口编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint等函数详解

Windows窗口编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint等函数详解

dvlinker的技术专栏 7167

利用Gretna软件计算脑网络的全局属性和局部属性指标

使用Gretna,你可以计算脑网络的全局属性指标(如网络特征、小世界性和模块度),以及局部属性指标(如节点度和聚类系数)。通过Gretna,你可以计算脑网络的稀疏度,并进一步探索网络的特征和特性。Gretna是一款基于MATLAB平台的脑网络分析工具,它提供了丰富的函数和工具箱,用于计算和分析脑网络的结构和功能。在脑网络中,较高的稀疏度可能意味着神经系统的高效性和信息处理能力,因为较少的连接可以降低信息传递的成本。连接矩阵是一个N*N的矩阵,其中N表示节点的数量,矩阵的每个元素表示节点之间的连接强度。

code_program481的博客 1809

[Unity shader]相交高亮的原理与实现

相交高亮是一种通过比较当前绘制片元深度与场景背景深度来实现的视觉效果。当渲染物体的表面与背景物体(如墙壁、地面)在空间上非常接近时,通过Shader计算产生高亮边缘,从而消除生硬的几何切割感,增强融合效果。

weixin_47758501的博客 1175

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Unity】图形相交检测

本文会实现几个圆形与其他2D图形的相交检测: 1、圆形与圆形 2、圆形与胶囊体 3、圆形与扇形 4、圆形与凸多边形 5、圆形与AABB 6、圆形与OBB

YDJ的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Unity两个圆是否相交的判断

Unity两个圆是否相交的判断

BlueMustard的博客 301

Unity3D ShaderLab 物体相交

物体相交物体相交思路实现效果 物体相交 利用深度图来做效果,不提供数学原理,只提供Shader脚本实现。 思路 已知需要渲染物体的深度信息,通过与_CameraDepthTexture纹理中的深度值进行一些计算或者判定即可完成相交的效果。 计算方式:在视图(View)坐标系下,假设物体深度值为eyeZeyeZeyeZ,深度缓存中的深度值为sceneZsceneZsceneZ,相交宽度为IntersectionWidthIntersectionWidthIntersectionWidth;通过abs(eyeZ

qq_37340753的博客 2153

Unity/C# 求三维空间中两个三角形相交的算法

原理在这里:https://web.stanford.edu/class/cs277/resources/papers/Moller1997b.pdf 这里有一个老哥写的中文笔记: https://blog.youkuaiyun.com/shenyi0_0/article/details/107831862 这篇论文也有对这个算法的一定解释: 三维网格模型实体布尔运算方法的研究与实现 杨兰 代码如下: // Tomas Moller 快速三角形求交算法 var T1 = targetMesh.trian

LanQ的博客 4718
上一篇: Unity 四元数
下一篇: VSCode Lua 高亮代码
Yanger_xy
博客等级 码龄18年 60粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值