前端 -- 计算机图形学基础:光与三角形面(Mesh)求交

全文目录:

    • 开篇语
    • 🌈 前言
    • 📖 目录
    • 🎨 基本概念
      • 💡 光线是什么?
      • 🛠️ Mesh(三角形面)是什么?
      • 🎯 为什么需要光与 Mesh 求交?
    • 📐 数学基础
      • 1️⃣ 光线的表示方式
      • 2️⃣ 三角形面的数学表达
      • 3️⃣ 光线与三角形求交的算法
        • 基本步骤:
    • 🛠️ 实践案例:光与三角形求交的实现
      • 🌟 基本代码实现
      • 💡 优化思路与扩展
    • 🎁 拓展知识:光追与 Mesh 求交的高级应用
    • 🎉 总结与感悟
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

🌈 前言

Hello,小伙伴们!👋 有没有想过,为什么 3D 游戏里的光线可以那么炫酷地穿梭、反射,甚至投影?光的路径和三角形面的交点计算,构成了计算机图形学的核心基础。听起来高深莫测?别担心,我今天就用最简单的语言,带你走进 光与三角形面(Mesh)求交 的世界!

什么是光与 Mesh 求交?简单来说,就是 “光射到物体上,它和物体的形状(Mesh)在什么位置相遇”。这个问题的答案,广泛应用于 3D 渲染、游戏开发和物理引擎中,可以说是让画面看起来“真实”的关键所在。

让我们开始探索吧!✨


📖 目录

  1. 🎨 基本概念
    • 光线是什么?
    • Mesh(三角形面)是什么?
    • 为什么需要光与 Mesh 求交?
  2. 📐 数学基础
    • 光线的表示方式
    • 三角形面的数学表达
    • 光线与三角形求交的算法
  3. 🛠️ 实践案例:光与三角形求交的实现
    • 基本代码实现
    • 优化思路与扩展
  4. 🎁 拓展知识:光追与 Mesh 求交的高级应用
  5. 🎉 总结与感悟

🎨 基本概念

💡 光线是什么?

在图形学中,光线可以简单地表示为:

P(t) = O + t * D  
  • O 是光线的起点,也叫 光源
  • D 是光线的方向
  • t 是光线在该方向上的距离

比如说,我们站在路灯下,路灯发出的光是一束束的光线,而 O 就是路灯的位置,D 是每束光的方向。


🛠️ Mesh(三角形面)是什么?

Mesh 是 3D 模型的基本单位,它由大量三角形面拼接而成。每个三角形都由三个顶点 V1, V2, V3 和它们之间的边组成。

在计算机里,三角形通常用如下数学形式表示:

P(u, v) = (1 - u - v) * V1 + u * V2 + v * V3  
  • uv 是两组局部坐标,定义了三角形上的点;
  • V1, V2, V3 是三角形的顶点坐标;
  • 只要 u >= 0, v >= 0, u + v <= 1,点 P 就在三角形内部。

🎯 为什么需要光与 Mesh 求交?

光与 Mesh 求交在图形学中意义重大,比如:

  1. 光影计算:光线射到物体表面时,判断哪个三角形被光照到。
  2. 反射与折射:光线穿过物体时,计算折射方向。
  3. 碰撞检测:判断光线是否与物体发生碰撞,比如激光射击命中目标。

一句话,没有光与 Mesh 求交,3D 世界就没有真实感! 🌍


📐 数学基础

1️⃣ 光线的表示方式

如前所述,光线公式是:

P(t) = O + t * D  

这里:

  • O 是光线的起点,D 是方向向量;
  • t 决定了光线的延伸程度:当 t > 0 时,表示光线在 D 方向延伸。

2️⃣ 三角形面的数学表达

三角形的点 P(u, v) 用如下公式计算:

P(u, v) = (1 - u - v) * V1 + u * V2 + v * V3  

其中,uv重心坐标。当 u >= 0, v >= 0, u + v <= 1,点 P 才位于三角形内部。


3️⃣ 光线与三角形求交的算法

问题:光线 P(t) 是否与三角形 P(u, v) 相交?如果相交,在哪里?

基本步骤:
  1. 求平面方程:三角形所在平面的法向量 N 通过顶点计算:

    N = normalize((V2 - V1) × (V3 - V1))
    
  2. 计算交点 t
    光线与平面相交时:

    t = ((V1 - O) · N) / (D · N)  
    

    如果 t < 0,说明光线与平面没有交点。

  3. 判断交点是否在三角形内
    将交点带入三角形的重心坐标公式,验证是否满足 u >= 0, v >= 0, u + v <= 1


🛠️ 实践案例:光与三角形求交的实现

🌟 基本代码实现

以下是 JavaScript 中计算光与三角形求交的代码实现:

function rayTriangleIntersect(O, D, V1, V2, V3) {const EPSILON = 1e-6;// 计算平面法向量const edge1 = subtract(V2, V1);const edge2 = subtract(V3, V1);const h = cross(D, edge2);const a = dot(edge1, h);// 检查光线是否平行于三角形if (a > -EPSILON && a < EPSILON) return null;const f = 1.0 / a;const s = subtract(O, V1);const u = f * dot(s, h);// 检查交点是否在三角形外部if (u < 0.0 || u > 1.0) return null;const q = cross(s, edge1);const v = f * dot(D, q);if (v < 0.0 || u + v > 1.0) return null;// 计算 t,获得交点const t = f * dot(edge2, q);if (t > EPSILON) {return add(O, scale(D, t)); // 返回交点坐标}return null; // 没有交点
}// 工具函数
function subtract(a, b) { return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]; }
function add(a, b) { return [a[0] + b[0], a[1] + b[1], a[2] + b[2]]; }
function scale(a, t) { return [a[0] * t, a[1] * t, a[2] * t]; }
function dot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; }
function cross(a, b) { return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; }

💡 优化思路与扩展

  • 使用加速结构(如 BVH 树)提高求交效率;
  • 在复杂场景中结合 GPU 并行计算进行大规模光追求交。

🎁 拓展知识:光追与 Mesh 求交的高级应用

  1. 光线追踪(Ray Tracing):通过光与 Mesh 求交实现高质量的全局光影效果。
  2. 实时渲染:在游戏开发中,光与 Mesh 求交被优化到毫秒级,为玩家提供流畅体验。
  3. 物理仿真:模拟光的反射、折射以及其他物理特性。

🎉 总结与感悟

从数学公式到代码实现,光与 Mesh 求交的过程不仅展现了图形学的魅力,还让人感受到数学的力量。虽然概念复杂,但只要一步步拆解,你就会发现,它其实并不难!

希望这篇文章能为你打开计算机图形学的大门,点亮你的 3D 世界开发之旅!有任何疑问或灵感,欢迎留言交流哦!👋


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

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

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

相关文章

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…

操作系统的特征

并发 指两个或多个事件在同一时间间隔内发生。这些时间宏观上是同时发生的&#xff0c;但微观上是交替发生的。 并行 指两个或多个事件在同一时刻同时发生 操作系统的并发性 指计算机系统重“同时”运行着多个程序&#xff0c;这些程序宏观上看是同时运行的&#xff0c;而…

数据结构——B树、B+树、哈夫曼树

目录 一、B树概念1.B树的构造2 .B树的特点 二、B树概念1.B树构造2.B树的特点 三、B树和B树的区别四、哈夫曼树1.哈夫曼树的基本概念2.哈夫曼树的构建 一、B树概念 B树的出现是为了弥合不同的存储级别之间的访问速度上的巨大差异&#xff0c;实现高效的 I/O。平衡二叉树的查找效…

电子签的法律效力、业务合规与监管难点

撰稿 | 区长 来源 | 贝多财经 据2025年央视“3.15”晚会报道&#xff0c;借贷宝、人人信等平台上存在高利贷的情形。放贷人与借款人在平台签署借款合同&#xff0c;但是实际借款金额低于合同金额&#xff0c;从而绕开平台对利率的限制。这引发了人们对电子签法律效力、业务合…

资金管理策略思路

详细描述了完整交易策略的实现细节&#xff0c;主要包括输入参数、变量定义、趋势判断、入场与出场条件、止损与止盈设置等多个方面。 输入参数&#xff08;Input&#xff09;&#xff1a; EntryFrL (.6)&#xff1a;多头入场的前一日波动范围的倍数。 EntryFrS (.3)&#xff1…

体育直播视频源格式解析:M3U8 vs FLV

在体育直播领域&#xff0c;视频源的格式选择直接影响着直播的流畅度、画质以及兼容性。目前&#xff0c;M3U8 和 FLV 是两种最为常见的视频流格式&#xff0c;它们各有优劣&#xff0c;适用于不同的场景。本文将从技术原理、优缺点以及应用场景等方面对 M3U8 和 FLV 进行详细解…

【动态规划】下降路径最小和

跟之前不同由于可能取到最右上角值&#xff0c;则左右各加一列&#xff0c;并且由于求最小值&#xff0c;则加的列须设置为正无穷大&#xff1b; class Solution { public:int minFallingPathSum(vector<vector<int>>& matrix) {int nmatrix.size();vector<…

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…

VScode

由于centos停止了维护 ,后面使用ubuntu 在Ubuntu中用vscode 充当记事本的作用 替代了centos中vim的作用 后面使用vscode编辑 vscode中继续使用makefile , xshell中的cgdb进行debug (半图形写 ,半命令行debug&&运行) 官网下载地址&#xff1a;https://code.visuals…

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…

异步编程与流水线架构:从理论到高并发

目录 一、异步编程核心机制解析 1.1 同步与异步的本质区别 1.1.1 控制流模型 1.1.2 资源利用对比 1.2 阻塞与非阻塞的技术实现 1.2.1 阻塞I/O模型 1.2.2 非阻塞I/O模型 1.3 异步编程关键技术 1.3.1 事件循环机制 1.3.2 Future/Promise模式 1.3.3 协程&#xff08;Cor…

python-selenium 爬虫 由易到难

本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动&#xff08;不容易遇到版本或者兼容性的问题&#xff09; 驱动下载网址&#xff1a;链接: link 1、实战1 &#xff08;1&#xff09;安装 selenium 库 pip install selenium&#…

前端OOM内存泄漏如何排查?

前言 现代前端开发中&#xff0c;随着应用的复杂性和交互性的增加&#xff0c;OOM&#xff08;Out Of Memory&#xff0c;内存不足&#xff09;问题和内存泄漏逐渐成为影响用户体验和应用性能的关键挑战。排查和解决这些问题需要开发人员具备良好的调试技巧和优化策略。 造成…

C++20:玩转 string 的 starts_with 和 ends_with

文章目录 一、背景与动机二、string::starts_with 和 string::ends_with&#xff08;一&#xff09;语法与功能&#xff08;二&#xff09;使用示例1\. 判断字符串开头2\. 判断字符串结尾 &#xff08;三&#xff09;优势 三、string_view::starts_with 和 string_view::ends_w…

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…

【MySQL】日志

目录 基本概念错误日志二进制日志查询日记慢查询日志 基本概念 日志&#xff08;Log&#xff09;是系统、软件或设备在运行过程中对发生的事件、操作或状态变化所做的记录。这些记录通常包含时间戳、事件类型、相关数据等信息&#xff0c;用于跟踪运行过程、排查故障、审计操作…

ArkUI-List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用&#xff0c;条件渲染&#xff0c;循环渲染&#xff0c;懒加载等渲染控制方式生成子组件…

Word限定仅搜索中文或英文引号

在Word中&#xff0c;按下CtrlF键&#xff0c;左侧会弹出导航搜索栏&#xff1b; 点击放大镜旁边的下拉栏&#xff0c;选择高级查找 在查找内容处输入英文状态下的"&#xff0c;然后选择更多->使用通配符&#xff0c;就可以仅查找英文状态下的" 同理&#xff…

智能飞鸟监测 守护高压线安全

飞鸟检测新纪元&#xff1a;视觉分析技术的革新应用 在现代化社会中&#xff0c;飞鸟检测成为了多个领域不可忽视的重要环节。无论是高压线下的安全监测、工厂内的生产秩序维护&#xff0c;还是农业区的作物保护&#xff0c;飞鸟检测都扮演着至关重要的角色。传统的人工检测方…

React初学分享 事件绑定 组价通信 useState useEffect

React初学 React介绍快速搭建React项目JSXJSX的本质优势&#xff1a;JSX中使用JS表达式JSX中的列表渲染JSX实现简单条件渲染JSX实现复杂条件渲染 React中的事件绑定React基础事件绑定传递自定义参数同时传递事件对象和自定义参数 React中的组件useState修改状态的规则状态不可变…