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

【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;
        }

    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker搭建Maven仓库Nexus

文章目录 一、简介二、Docker部署三、仓库配置四、用户使用Maven五、管理Docker镜像 一、简介 Nexus Repository Manager(简称Nexus)是一个强大的仓库管理器。 Nexus3支持maven、docker、npm、yum、apt等多种仓库的管理。 建立了 Maven 私服后&#xf…

大小端解释以及如何使用程序判断IDE的存储模式

今天让我们来了解一下大小端的概念吧 什么是大小端? 大端(存储)模式:指的是数据的低位保存在内存的高地址处,而数据的高位则保存在内存的低地址处。 小端(存储)模式:指的是数据的低位…

jvm中的垃圾回收器

Jvm中的垃圾回收器 在jvm中,实现了多种垃圾收集器, 包括: 1.串行垃圾收集器 2.并行垃圾收集器 3.CMS(并发)垃圾收集器 4.G1垃圾收集器 1.串行垃圾回收器 效率低,使用较少 2.并行垃圾回收器 3.并发垃圾回…

InternLM2-lesson3作业+笔记

茴香豆 https://www.bilibili.com/video/BV1QA4m1F7t4/?vd_source902e3124d4683c41b103f1d1322401fa 一、笔记 RAG RAG(Retrieval Augmented Generation)是一种结合了检索(Retrieval)和生成(Generation)的技术,旨在通过利用外部知识库来增强大预言模型的性能。…

ctfshow web入门 web180--web185

web180 import requests import recom re.compile("admin") def repisTrue(char):url f"http://自己环境的网址/api/?id1%27and%27{char}%27%27{char}&page1&limit10"res requests.get(url)w com.search(res.text)if w is not None:return T…

windows系统下python开发工具安装

一. 简介 前一篇文章学习了安装 python解释器,文章如下: windows系统下python解释器安装-CSDN博客 本文来学习如何下载安装 python开发工具 PyCharm。 二. python开发工具 PyCharm下载安装 1. PyCharm官网 PyCharm开发工具 PyCharm为 python代码…

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决 文章目录 1.前言2.doris是什么?2.1简介2.2介绍2.3使用场景2.4架构 3.官网4.构建部署4.1 构建环境4.2 doris2.0.4的fe和be镜像构建4.2.1 fe2.0.4镜像构建脚本4.2.2 be2.0.4镜像构建4.2.3 启动脚…

Linux 操作系统的引导过程

Linux系统开机引导过程: 开机自检 检测硬件设备,找到能够引导系统的设备,比如硬盘MBR引导 运行MBR扇区里的主引导程序GRUB启动GRUB菜单 系统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和…

centos7+mysql57安装以及初始化

1、下载安装yum官方mysql源: http://repo.mysql.com/ ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/061472a86e9e4548b76d4603d4614568.png rpm -ivh mysql57-community-release-el7.rpm2、yum安装mysql服务 yum install -y mysql-community-server…

深兰科技入选2024全国“人工智能+”行动创新案例TOP100

近日,中科院《互联网周刊》联合eNET研究院、德本咨询、中国社会科学院信息化研究中心共同发布了《2024全国“人工智能”行动创新案例TOP100》榜单。经评委会层层遴选,深兰科技专为洛阳市打造的“工业智能化洛阳中心”项目成功入围该榜单。一同入围的还包…

Threejs 相机定位聚焦

网上大部分讲功能的时候,讲的太复杂了,或者就是讲不清,今天我就给大家简单简洁的描述下这个聚焦定位咋做如下: 扫码关注下: 聚焦定位只要就是设置相机的位置,和更新相机的朝向,就如一个人站在这…

2024三掌柜赠书活动第二十四期:containerd原理剖析与实战

目录 前言 Containerd的架构 Containerd的工作流程 Containerd的实战演示 关于《containerd原理剖析与实战》 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《containerd原理剖析与实战》全书速览 结束语 前言 作为开发者,对于编程语言并不陌生&…

Atlas Vector Search:借助语义搜索和 AI 针对任何类型的数据构建智能应用

Atlas Vector Search已正式上线! Vector Search(向量搜索)现在支持生产工作负载,开发者可以继续构建由语义搜索和生成式人工智能驱动的智能应用,同时通过 Search Node(搜索节点)优化资源消耗并…

Android—— log的记忆

一、关键log 1.Java的 backtrace(堆栈log) 上述是一个空指针异常,问题出现在sgtc.settings,所以属于客户UI问题。 2.WindowManager(管理屏幕上的窗口和视图层次结构) 3.ActivityManager(管理应用程序生命周期和任务栈) 4.wifi操作 (1) 连接wifi&#…

2024深圳杯数学建模挑战赛C题:编译器版本的识别问题思路代码成品论文分析

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯数学建模挑战赛2024C题:编译器版本的识别问题 作为一种重要的工具,电子…

【后端】python2和python3的安装与配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、python是什么二、python环境的安装与配置Python 2的安装与配置Python 3的安装与配置注意事项 三、总结 前言 随着开发语言及人工智能工具的普及&#xff0…

信息打点--公众号服务

微信公众号 获取微信公众号的途径https://weixin.sogou.com/ 微信公众号没有第三方服务 Github监控 人员&域名&邮箱 eg:xxx.cn password in:file https://gitee.com/ https://github.com/ https://www.huzhan.com/ 资源搜索 in:name test 仓库标题搜索含有…

Linux--内核移植(二)移植流程及驱动修改

本文来总结一下如何将 NXP 官方提供的 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板上。 一、官方开发板内核测试 NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的,所以我们肯定是以 I.MX6ULL EVK 开发板为参考&#xff0…

DFS与回溯专题:路径总和问题

DFS与回溯专题:路径总和问题 一、路径总和 题目链接: 112.路径总和 题目描述 代码思路 对二叉树进行dfs搜索,递归计算每条路径的节点值之和,当某个节点的左右子节点都为空时,说明已经搜索完成某一条路径&#xff0…

中北大学软件学院操作系统实验二进程调度算法

实验时间 2024年 4 月13日14时至16时 学时数 2 1.实验名称 实验二进程调度算法 2.实验目的 (1)加深对进程的概念及进程调度算法的理解; (2)在了解和掌握进程调度算法的基础上,编制进程调度算法通用程序,将调试结果显示在计算机屏幕上&am…