当前位置: 首页 > article >正文

Unity 中计算射线和平面相交距离的原理

有此方法
在这里插入图片描述
能够计算射线和平面是否相交以及射线起点到平面交点的距离

代码分析

var dot = Vector3.Dot(ray.direction, plane.normal);

计算射线和平面法线的点积,如果大于等于0,则说明射线和平面没有相交,否则,说明射线和平面相交
在这里插入图片描述

distance = -(Vector3.Dot(ray.origin, plane.normal) + plane.distance) / dot;

对于一个平面,它的标准方程是Ax + By + Cz + D = 0,其中(A, B, C)是平面法向量,D是平面到原点的距离,这里的xyz的意思是,当你有一个点 (x,y,z) 时,你可以将这个点的坐标代入平面方程 Ax+By+Cz+D=0 中。如果等式成立(即结果为0),则该点位于平面上;如果不成立(即结果不为0),则该点不在平面上。
根据上面的说法,射线和平面相交的这个点代入这个公式,如果等于0,就说明这个点在平面上,即我们需要的这个交点
射线的参数方程可以表示为:
P = origin + t ⋅ direction
其中,P 是射线上的任意一点,origin 是射线的起点,direction 是射线的方向向量,t 是一个参数,它表示从起点到点 P 的距离(但注意这里的距离是沿着射线方向的,所以实际上是一个标量倍数,用于缩放方向向量)
将点P代入平面方程
A(origin.x+t⋅direction.x)+B(origin.y+t⋅direction.y)+C(origin.z+t⋅direction.z)+D=0
这里,origin.x,origin.y,origin.z 是射线起点的坐标,direction.x,direction.y,direction.z 是射线方向向量的分量
那么
t = -(A * origin.x + B * origin.y + C * origin.z + D) / (A * direction.x + B * direction.y + C * direction.z)
前面一部分就是射线的起点和平面法向量的点积 + 平面和原点的距离,后面一部分就是射线方向和平面法向量的点积


http://www.kler.cn/a/467220.html

相关文章:

  • 基于YOLOv8的摩托车驾驶员头盔检测系统
  • 逆向入门(6)汇编篇-外挂初体验
  • qml Rectangle详解
  • “大数据+职业本科”:VR虚拟仿真实训室的发展前景
  • 滑动窗口。
  • Java SpringBoot使用Apache POI导入导出Excel文件
  • 01 数据分析介绍及工具准备
  • 如何利用excel的透视表
  • 力扣--494.目标和
  • 机器学习详解(13):CNN图像数据增强(解决过拟合问题)
  • [读书日志]从零开始学习Chisel 第一篇:书籍介绍,Scala与Chisel概述,Scala安装运行(敏捷硬件开发语言Chisel与数字系统设计)
  • 博时基金宋和文:以责任之名,共筑公益梦想
  • 每日十题八股-2025年1月4日
  • 第 31 章 - 源码篇 - Elasticsearch 写入流程深入分析
  • 【学习总结|DAY027】JAVA操作数据库
  • Flume拦截器的实现
  • 笔记本电脑扩展的显示器如何左右或上下分屏显示?
  • springboot使用hutool captcha +vue实现图形验证码
  • 智能新纪元:代理AI的崛起与未来
  • ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具)