射线和平面求交

射线和平面求交

在这里插入图片描述

1、平面方程

如果已知平面的高度(即沿法向量方向的距离)为 height,平面方程可以表示为:

n ^ ⋅ p = h e i g h t \bold{\hat{n}} \cdot p = height n^p=height

p p p 是平面上的任意一点
height 的正负取决于法向量的方向。

2、射线参数方程

r ( t ) = p 0 + t ⋅ d i r \bold{r}(t) = p_0 + t \cdot \bold{dir} r(t)=p0+tdir

p 0 p_0 p0: 是射线的起点
d i r dir dir: 是射线的方向向量
t t t: 表示沿着方向向量走的距离

3、计算交点

n ^ ⋅ ( p 0 + t ⋅ d i r ) = h e i g h t \bold{\hat{n}} \cdot (p_0 + t \cdot \bold{dir}) = height n^(p0+tdir)=height

展开后:
n ^ ⋅ p 0 + t ⋅ ( n ^ ⋅ d i r ) = h e i g h t \bold{\hat{n}} \cdot p_0 + t \cdot (\bold{\hat{n}} \cdot \bold{dir}) = height n^p0+t(n^dir)=height

解这个方程,求出 t t t:
t = h e i g h t − n ^ ⋅ p 0 n ^ ⋅ d i r t = \frac{height - \bold{\hat{n}} \cdot p_0}{\bold{\hat{n}} \cdot \bold{dir}} t=n^dirheightn^p0

4、代码实现
/**
 * 计算射线和平面的交点
 * @param source 射线起点
 * @param dir 射线方向
 * @param normal  平面法向量
 * @param height  平面高度
 */
vec3 interceptPlane(in vec3 source, in vec3 dir, in vec3 normal, float height)
{
    float distance = (-height - dot(normal, source)) / dot(normal, dir);

    if (distance > 0.0)
        return source + dir * distance;
    else
        return vec3(infinity);  // 返回一个表示无穷远的向量
}

相关推荐

  1. 1059:平均年龄

    2024-07-19 02:00:02       43 阅读
  2. C++线段:计算两条线段的交点

    2024-07-19 02:00:02       44 阅读
  3. c++【入门】平均

    2024-07-19 02:00:02       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 02:00:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 02:00:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 02:00:02       58 阅读
  4. Python语言-面向对象

    2024-07-19 02:00:02       69 阅读

热门阅读

  1. 力扣第十二题——整数转罗马数字

    2024-07-19 02:00:02       21 阅读
  2. Qt 实战(6)事件 | 6.3、自定义事件

    2024-07-19 02:00:02       24 阅读
  3. 数据库(Database,简称DB)介绍

    2024-07-19 02:00:02       20 阅读
  4. x264、x265、libaom 编码对比实验

    2024-07-19 02:00:02       21 阅读
  5. Bootstrap apexLine后端数据与前端Asp.net MVC数据交互

    2024-07-19 02:00:02       21 阅读
  6. DW1000在STM32环境下实现定位功能

    2024-07-19 02:00:02       22 阅读
  7. Vue3快速入门1

    2024-07-19 02:00:02       22 阅读
  8. 微信小程序:3.页面开发

    2024-07-19 02:00:02       21 阅读
  9. MySQL简介

    2024-07-19 02:00:02       19 阅读
  10. Vue + litegraph.js 实现蓝图功能

    2024-07-19 02:00:02       25 阅读
  11. c语言(函数7.18)

    2024-07-19 02:00:02       24 阅读
  12. RK3568 linux-5.10 rk809 声卡实现spk hp自动切换

    2024-07-19 02:00:02       22 阅读
  13. 蜣螂算法(BSO)及Python和MATLAB实现

    2024-07-19 02:00:02       21 阅读
  14. A. Little Nikita

    2024-07-19 02:00:02       20 阅读