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

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

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

相关文章

c++图论基础(1)

目录 无向图 无向图度 无向图性质 有向图 有向图度 有向图性质 图的分类: 稀疏图: 稠密图: 零图: 有向完全图: 无向完全图: 度序列: 图是由顶点集合(简称点集)和顶点间的边(简称边…

Weblogic JMS

简介 全称:WebLogic Server的Java Messaging Service(JMS) WebLogic JMS 是与 WebLogic Server 平台紧密集成的企业级消息传递系统。 Java Message Service (JMS) API 是一种消息传递标准,允许基于 Java Platform Enterprise Edition (Java EE) 的应用程序组件创建、发送、…

windows rabbitMq安装

一、Erlang 环境准备 下载安装包 跟我们跑java项目,要装jdk类似。rabbitMQ是基于Erlang开发的,因此安装rabbitMQ服务器之前,需要先安装Erlang环境。 官网直接下载windows直装版本:https://www.erlang.org/downloads 无脑安装&a…

【RocketMQ知识点总结-1】

文章目录 RocketMQ介绍RocketMQ架构:NameServer:BrokerProducerTopic(主题):Queue(队列):Message(消息): RocketMQ的工作流程RocketMQ的使用场景异步消息传递…

预训练扩散模型用于即插即用的医学图像增强

文章目录 Pre-trained Diffusion Models for Plug-and-Play Medical Image Enhancement摘要本文方法Image Enhancement with Denoising AlgorithmPre-Trained Diffusion Models for Plug-and-play Medical Image Enhancement 实验结果 Pre-trained Diffusion Models for Plug-a…

CentOS安装SonarQube

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 sonar是一款静态代码质量分析工具,支持Java、Python、PHP、JavaScript、…

C++ | Leetcode C++题解之第51题N皇后

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> solveNQueens(int n) {auto solutions vector<vector<string>>();auto queens vector<int>(n, -1);auto columns unordered_set<int>();auto diag…

【redis】Redis数据类型(二)Hash类型

目录 Hash类型介绍特性hash 的内部编码方式/底层结构hashtableziplistlistpack 适用场景举例 常用命令hset示例 hsetnx示例&#xff1a; hmset示例 hget示例 hmget示例 hgetall示例 hdel示例 hlen示例 hexists示例 hincrby示例 hincrbyfloat示例 hkeys示例 hvals示例 Hash类型介…

光纤网络电力控制系统设计方案:623-6U CPCI的光纤网络电力控制系统

6U CPCI的光纤网络电力控制系统 一、设备概述 柔性直流输电系统中用于控制与测量的FS系统&#xff0c;适用于风电和太阳能发电的并网快速数值计算和闭环控制&#xff0c;以及与直流输电系统的换流器有关的特殊控制功能&#xff0c;包括门控单元的信号处理。该控制板的最大…

【C++】:手撕红黑树(红黑树的模拟实现)

每日给大家介绍一家公司 如下 接下来我们进入正题 1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树…

2024蓝桥杯CTF--逆向

蓝桥杯付费CT--逆向 题目&#xff1a;RC4题目&#xff1a;happytime总结&#xff1a; 题目&#xff1a;RC4 先查壳&#xff0c;无壳&#xff0c;并且是32位&#xff1a; 用32位的ida打开&#xff0c;直接定位到main函数&#xff1a; 重点关注sub_401005函数&#xff0c;这个应…

SDM模型——建模用户长短期兴趣的Match模型

1. 引言 SDM模型(Sequential Deep Matching Model)是阿里团队在2019年CIKM的一篇paper。模型属于序列召回模型&#xff0c;研究的是如何通过用户的历史行为序列去学习到用户的丰富兴趣。 SDM模型把用户的历史序列根据交互的时间分成了短期和长期两类&#xff0c;然后从短期会…

构建NodeJS库--前端项目的打包发布

1. 前言 学习如何打包发布前端项目&#xff0c;需要学习以下相关知识&#xff1a; package.json 如何初始化配置&#xff0c;以及学习npm配置项&#xff1b; 模块类型type配置&#xff0c; 这是nodejs的package.json的配置main 入口文件的配置 webpack 是一个用于现代 JavaSc…

基于java+springboot+vue实现的个人博客系统(文末源码+Lw)200

摘 要 随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开始的群众不信任&#xff0c;到现在的离不开&#xff0c;中间经历了很多挫折。本次开发的个人博客系统&#xff0c;有管理员&#xff0c;用户&#xf…

excel一列同乘同一个数

excel一列同乘同一个数 第一种方法&#xff08;excel本身功能&#xff09; 在空白区域输入要乘以的数&#xff0c;比如0.5 右键选择复制 选中需要乘以的单元格&#xff0c;选择性粘贴 点击乘&#xff0c;选择确定 删除0.5后也不会改变值 第二种方法&#xff08;方方格子…

HODL、FUD、FOMO 等其他比特币俚语是什么意思?

作者&#xff1a;Paxful Team 1、FOMO&#xff08;惧怕错失机会&#xff09; FOMO 是惧怕错失机会的缩写&#xff0c;可用于日常生活。它指的是当其他人都在谈论比特币时&#xff0c;产生的购买比特币的紧迫感。 2、Shill&#xff08;不断推广吹捧&#xff09; Shilling 是指…

上传jar到github仓库,作为maven依赖存储库

记录上传maven依赖包到github仓库问题 利用GitHubPackages作为依赖的存储库踩坑1 仓库地址问题踩坑2 Personal access tokens正确姿势一、创建一个普通仓库&#xff0c;比如我这里是fork的腾讯Shadow到本地。地址是&#xff1a;https://github.com/dhs964057117/Shadow二、生成…

[C++ QT项目实战]----C++ QT系统实现多线程通信

前言 在C QT中&#xff0c;多线程通信原理主要涉及到信号与槽机制和事件循环机制。 1、信号与槽机制&#xff1a; 在QT中&#xff0c;信号与槽是一种用于对象间通信的机制。对象可以通过发送信号来通知其他对象&#xff0c;其他对象通过连接槽来接收信号并进行相应的处…

39岁TVB靓仔小生自曝恋情,曾沦为洗车工如今半年赚足7位数

39岁高钧贤自从2005年参加香港先生选举夺冠后&#xff0c;之后加入TVB拍摄过多套电视剧集&#xff0c;最近更有份参与《逆天奇案2》&#xff0c;日前他回到TVB电视城一厂与冯盈盈宣传剧集&#xff0c;更随即拍摄短片纪录放在网上分享&#xff0c;意外曝光TVB餐厅餐单&#xff0…