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

有此方法

能够计算射线和平面是否相交以及射线起点到平面交点的距离

代码分析

csharp 复制代码
var dot = Vector3.Dot(ray.direction, plane.normal);

计算射线和平面法线的点积,如果大于等于0,则说明射线和平面没有相交,否则,说明射线和平面相交

csharp 复制代码
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)

前面一部分就是射线的起点和平面法向量的点积 + 平面和原点的距离,后面一部分就是射线方向和平面法向量的点积

相关推荐
不伤欣44 分钟前
Unity Mask镂空效果(常用于新手引导或高亮显示UI元素)
游戏·ui·unity·游戏引擎
zhangzhangkeji20 小时前
cesium126,230217,Pixel Streaming in Unreal Engine 像素流 - 1 基本概念:
游戏引擎·虚幻
AA陈超2 天前
虚幻引擎UE5专用服务器游戏开发-33 在上半身播放组合蒙太奇
c++·游戏·ue5·游戏引擎·虚幻
软泡芙2 天前
【Unity】HybridCLR:原生C#热更新革命
unity·游戏引擎
AA陈超2 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-05 游戏效果委托
c++·游戏·ue5·游戏引擎·虚幻
大Mod_abfun2 天前
Unity游戏基础-5(一些细节)
游戏·unity·游戏引擎
AA陈超2 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P04-12 可缩放浮点数的曲线表
c++·游戏·ue5·游戏引擎·虚幻
Evand J3 天前
组合导航的MATLAB例程,二维平面上的CKF滤波,融合IMU和GNSS数据,仿真,观测为X和Y轴的坐标,附代码下载链接
开发语言·matlab·平面·imu·组合导航
心疼你的一切3 天前
使用Unity引擎开发Rokid主机应用的模型交互操作
游戏·ui·unity·c#·游戏引擎·交互
淡海水3 天前
【URP】Unity[内置Shader]光照着色器Lit
unity·游戏引擎·shader·urp·着色器·lit