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

news2024/11/23 9:42:54

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

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

原理

如下图

GD组成的线段和ABC组成的三角形相交与E点,ABCDG的坐标已知求E点坐标。

首先用叉乘求出ABC面的法线 N ⃗ \vec{N} N ;(D点到ABC点的向量在 N ⃗ \vec{N} N 上的投影是相同的,同样到E点的向量在 N ⃗ \vec{N} N 的投影也是一样的)

分别用点乘的方法求出, D A ⃗ \vec{DA} DA N ⃗ \vec{N} N 的投影模长a和 D G ⃗ \vec{DG} DG N ⃗ \vec{N} N 的投影模长b;

D E ⃗ \vec{DE} DE N ⃗ \vec{N} N 的投影模长同样等于a

∴由相似三角形可得
a b = ∣ D E ⃗ ∣ ∣ D G ⃗ ∣ \frac{a}{b}=\frac{|\vec{DE}|}{|\vec{DG}|} ba=DG DE
由次可得E点的坐标

实现代码

    Vector3 GetIntersectPoint(Vector3 C1, Vector3 C2, Vector3 C3, Vector3 L1, Vector3 L2)
    {
        //求面的法线
        Vector3 n0 = (C2 - C1).normalized;
        Vector3 n1 = (C2 - C3).normalized;
        Vector3 N = Vector3.Cross(n0,  n1);
        //线段的向量和到面上点的向量
        Vector3 line1 = L2 - L1;
        Vector3 line2 = C1 - L1;
        //与面法线点成比,得到线段点到面的模长
        float dis1 = Vector3.Dot(N, line1);
        float dis2 = Vector3.Dot(N, line2);
        float magnitude = (dis2 / dis1)*line1.magnitude;
        //用线段的单位向量乘模长求出交点
        Vector3 direction = line1.normalized * magnitude;
        return L1 + direction;

    }

同样的方法也可以计算两条线段的加点

Vector3 GetIntersectPoint(Vector3 C1, Vector3 C2, Vector3 P1, Vector3 P2)
    {
       // 分别求出两个线段的单位向量
        Vector3 L0=(C2 - C1).normalized;
        Vector3 L1=( P2 - P1).normalized;
       //俩次差乘建立 L0为一个坐标轴的的坐标系
        Vector3 H = Vector3.Cross(L0,  L1);
        Vector3 N = Vector3.Cross( L0, H);

        float dis1 = Vector3.Dot(N, L1);
        float dis2 = Vector3.Dot(N, (P1-C1));
      
        float magnitude = dis2 / dis1;
        return L1 * magnitude + P1;
     }

叉乘判断线段和面是否相交

 //判断面和线段是否相相交
    bool isCut(Vector3 C1, Vector3 C2, Vector3 L1, Vector3 L2)
    {
        Vector3 V0 = squeeze( C2 - C1);
        Vector3 V1 = squeeze( L1 - C1);
        Vector3 V2 = squeeze( L2 - C1);
        Vector3 Cross1 = Vector3.Cross(V0, V1).normalized;
        Vector3 Cross2 = Vector3.Cross(V0, V2).normalized;
        float Dot = Vector3.Dot(Cross1, Cross2);
        if (Dot>0)
        {
            //同边不相交
            return false;
        }
        else
        {
            //同异边相交
            return true;
        }

    }
   //坐标平面化,去除y值
    Vector3 squeeze(Vector3 vector)
    {
        return new Vector3(vector.x, 0, vector.z);
    }

判断两条线段是否相交

    bool isCut(Vector3 C1, Vector3 C2, Vector3 L1, Vector3 L2)
    {
        Vector3 V0 =C2 - C1;
        Vector3 V1 =L1 - C1;
        Vector3 V2 = L2 - C1;
        Vector3 Cross1 = Vector3.Cross(V0, V1).normalized;
        Vector3 Cross2 = Vector3.Cross(V0, V2).normalized;
        float Dot = Vector3.Dot(Cross1, Cross2);
          if (Dot>0)
        {
            //同边不相交
            return false;
        }
        else
        {
            //同异边相交
            return true;
        }

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1633603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win11 Windows ADK制作的win pe中没有manage-ade命令或命令无法正常工作解决办法

解决办法 不使用win pe,而是使用Windows安装程序。 将iso镜像烧录到u盘,然后从它引导。 按shift f10弹出cmd,里面存在manage-bde且正常工作。 其他 win pe找不到命令manage-ade 在win pe上使用manage-ade需要一个包 a,adk制作…

计算机网络 备查

OSI 七层模型 七层模型协议各层实现的功能 简要 详细 TCP/IP协议 组成 1.传输层协议 TCP 2.网络层协议 IP 协议数据单元(PDU)和 封装 数据收发过程 数据发送过程 1. 2.终端用户生成数据 3.数据被分段,并加上TCP头 4.网络层添加IP地址信息…

练习题(2024/4/29)

在深度优先遍历中:有三个顺序,前中后序遍历 这里前中后,其实指的就是中间节点的遍历顺序,只要记住 前中后序指的就是中间节点的位置就可以了。 如图 1二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前…

Vue3+Nuxt3 从0到1搭建官网项目(SEO搜索、中英文切换、图片懒加载)

Vue2Nuxt2 从 0 到1 搭建官网~ 想开发一个官网,并且支持SEO搜索,当然离不开我们的 Nuxt ,Nuxt2 我们刚刚可以熟练运用,现在有出现了Nuxt3,那通过本篇文章让我们一起了解一下。 安装 Nuxt3 // npx nuxilatest init &…

乐观锁悲观锁

视频:什么是乐观锁?什么是悲观锁?_哔哩哔哩_bilibili

Leetcode—2739. 总行驶距离【简单】

2024每日刷题(121) Leetcode—2739. 总行驶距离 实现代码 class Solution { public:int distanceTraveled(int mainTank, int additionalTank) {int consume 0;int ans 0;while(mainTank ! 0) {mainTank--;consume;if(consume 5 && additio…

数据分析案例-全球表面温度数据可视化与统计分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

基于SpringBoot+Vue高校汉服租赁网站的设计与实现

项目介绍: 高校汉服租赁网站管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、交流论坛管理、公告资讯管理、汉服信息管理、汉服收藏管理、汉服评价管理、汉服租赁管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库&#xff0c…

03 后端入参校验:自定义注解实现

03 后端入参校验:自定义注解实现 一、前言二、实现1、新建Spring Boot项目2、引入依赖3、新建注解类4、新建校验器5、全局异常处理器6、编写Controller7、新建实体类8、启动并测试 一、前言 在 Java 后端开发中,为了实现入参校验,常常会使用…

外径合格与否对线缆品质有着直接影响 应用测径仪很重要

关键词:测径仪,线缆测径仪,电缆测径仪,外径测量仪,线缆,电缆 电缆尺寸不合格的危害 1、传输性能下降:尺寸不合格会导致电线电缆的参数不符合设计要求,从而影响传输的速率和稳定性,从而导致数据传输缓慢,影响用户的使用…

PC 自动化测试入门 - pywinauto 上篇:初识

文章目录 前言PC 自动化测试 是什么?常用 PC 自动化测试工具pywinauto 是什么?Windows上支持的可访问性技术列表 操作记事本自动写入问题app Application(backend"uia").start("notepad.exe") 无法正常启动组件选择器和 print_cont…

使用这 7 个绩效评估模板简化您的员工评估

绩效评估受到了不好的评价;员工发现它们压力很大,而管理者则发现它们很耗时。 但随着绩效管理成为 2024 年人力资源的首要任务,也许是时候重新思考了。绩效评估模板可以帮助减轻评估过程的麻烦。通过为管理者提供一种简单、标准化的方法来评…

CVE-2024-3116 PgAdmin8.4代码执行漏洞

前言 在有闲情的时候,看了一下最近的CVE,看到了pgAdmin4在8.4版本之前存在着一个远程代码执行漏洞,因为pgAdmin4在github是开源的,网上也没有看到分析文章,于是就把源码下载了下来,根据漏洞的描述大致的分…

Linux服务器终端软件termius以及Xshell + WinSCP组合

1. termius 官网地址:https://termius.com/ Termius是一个跨平台的SSH客户端,它提供了一个便捷的方式来远程连接和管理服务器、虚拟机和网络设备。以下是Termius的一些特点和功能: 跨平台支持:Termius可在多个操作系统上运行&…

JS事件循环、宏任务与微任务

在JavaScript中,事件循环(Event Loop)是处理异步操作的核心机制。它负责执行代码,处理事件,并在适当的时候调度回调。为了更好地理解JavaScript的执行模型,我们需要深入探讨事件循环、宏任务(Ma…

分布式与一致性协议之Raft算法(二)

Raft算法 什么是任期 我们知道,议会选举中的领导者是有任期的,当领导者任命到期后,需要重新再次选举。Raft算法中的领导者也是有任期,每个任期由单调递增的数字(任期编号)标识。比如,节点A的任期编号是1。任期编号会…

基于Docker + Locust的数据持久化性能测试系统

前几天给大家分享了如何使用Locust进行性能测试,但是在实际使用中会发现存在压测的结果无法保存的问题,比如在分布式部署情况下进行压测,每轮压测完成需要释放资源删除容器重新部署后,这段时间的压测结果就都丢失了,如…

Nacos 安全零信任实践

作者:柳遵飞 Nacos 作为配置中心经常存储一些敏感信息,但是由于误用导致安全风险,最常见的主要是以下两个问题: 1)Nacos 暴露公网可以吗?不可以,因为 Nacos 定位是注册配置中心,是…

【STM32+HAL】SDIO模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片: STM32F407ZGT6 2、IDE: MDK-Keil软件 3、库文件:STM32F4xxHAL库 三、实现功能 实现用DMA读写SD卡内…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置:2C,2G内存,50G存储 3、集群架构 从表格中,可以看出,Hadoop集群,主要有2部分,一个是HDFS服务,一个是YARN服务 …