“模型法线到视图法线”的变换矩阵(normal matrix)的计算和作用

news/2025/11/6 20:36:35/文章来源:https://www.cnblogs.com/icmzn/p/19197611

“模型法线到视图法线”的变换矩阵(normal matrix)
作用:用于在 光照计算(lighting) 中,将 模型空间中的法线方向 正确地转换到 视图空间(或摄像机空间),以便与光照方向、视点方向等在同一坐标系下进行正确的光照计算

 实际使用:三角面片的法向量n,用NormalMatrix矩阵左乘n,则得到的是在:视图空间(摄像机坐标系)中的法向量表示。

1.  为什么要转换法线方向?

  在3D渲染中,每个顶点(或片元)都会进行光照计算,例如:

diffuse = max(dot(N, L), 0.0)
specular = pow(max(dot(R, V), 0.0), shininess)

其中:

  • N = 法线向量,(例如:三角面片的发现向量)

  • L = 光源方向

  • V = 视线方向

  • 这些向量必须在 同一个坐标系中计算(通常是视图空间)。

2 问题:模型空间中的法线不能直接用

模型经过各种变换(旋转、平移、缩放、剪切)后:

  • 模型的顶点位置会改变。

  • 法线方向也会被扭曲,尤其是当模型有 非均匀缩放

例如:如果模型在X方向缩放2倍,法线也会被“压扁”,导致光照变暗或错误。

  所以法线(模型三角面片的法线)需要用专门的矩阵变换来保持正确的方向。

  

3. 解决方法:使用 NormalMatrix(法向量矩阵:作用专门用于三角面片法向量的变换)

  法线矩阵的计算,需要看转化后的“操作空间”。

  (1)如果目标是世界坐标系:就是希望得到在世界坐标系下的三角面片的法向量。

  NormalMatrix=模型变换矩阵M的逆矩阵的转置。

  (2)如果目标是在视图坐标系(相机坐标系下):希望得到在视图坐标系下的三角面片的法向量。

  NormalMatrix=视图变换V * 模型变换矩阵M的逆矩阵的转置。

如下:

image

 Nword:表示的意思。如果模型到世界坐标系存在:模型矩阵,则模型坐标系中的法向量,转化为世界坐标系中的法向量表示,就是用: 

代码实现:

view_normal_matrix = view3x3 * model3x3.inverse().transpose();

4. 用途总结(重点)

image

 在着色器中使用:

// uniform matrices
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat3 normalMatrix; // (viewMatrix * modelMatrix⁻¹)ᵀ 的前3x3部分in vec3 normal_model;//模型坐标系中的法向量
out vec3 normal_view;void main() {normal_view = normalize(normalMatrix * normal_model);//计算后,得到视图空间(相机空间)的对应的法向量表示
}

 

 

 

 

 

 

 

 

endl;

 

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

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

相关文章

首批凭借!华为云CodeArts Snap智能开发助手通过可信AI智能编码设备评估,获当前最高等级

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

去年夏天

还有什么等待 还有什么悲哀 这故事中的人不太精彩 夏去了又回来 而人却已不在 它重复着我汹涌的忍耐 今年兰花又开 开了它也会败 我想要一个人活得精彩 有些人总会来 有些人在我心中在徘徊 我拿了总会还 你拿了就逃开 …

pythontip 字符串首位连接

字符串的连接‘+’ str1+str2 收到多个字符串使用input_str存储 调用时列表起始0 input()得到的字符串列表存储 input_str[0]+input_str[-1] def join_first_last(input_str): return input_str[0]+input_str[-1] 输入…

aspose-pdf 修改pdf文件备忘录

public class PatchedLicense {public static DateTime NewParseExact(string s, string format, IFormatProvider provider){return new DateTime(2099, 12, 30);}public static void Run(){MethodHookManager.Instan…

第28节:网络同步与多人在线3D场景 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

别再选错!5分钟掌握AI Agent框架选型的方法

本文介绍AI Agent框架选型指南,阐述了框架对AI应用开发的重要性,将主流框架分为入门友好型、多智能体协作、复杂流程建模、自主决策能力和企业级应用五大类9种框架,从技术复杂度、功能特性、行业适用性等维度进行对…

完整教程:【Qt MOC预处理器解读与使用指南】

完整教程:【Qt MOC预处理器解读与使用指南】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

Linux - 7 磁盘管理篇

1)tree 可视化目录 tree 是 Linux 中可视化目录结构的实用工具,能以树形图形式递归展示目录下的文件和子目录,清晰直观,常用于文档整理、项目结构查看、运维排查等场景。以下从「安装、基础用法、进阶参数、实用场…

java word转 pdf

<!-- https://mvnrepository.com/artifact/com.luhuiguo/aspose-words --><dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-words</artifactId><version>2…

11-05 题

11-05 题P7468 [NOI Online 2021 提高组] 愤怒的小 N - 洛谷 CF1938M - 2024 ICPC Asia Pacific Championship CF1466H Finding satisfactory solutions - 洛谷 P8147 [JRKSJ R4] Salieri - 洛谷 CF1770F Koxia and Se…

Markdown之Typora语法

Markdown之Typora语法 标题 #+空格:一级标题 ##+空格:二级标题 ...... 最多支持六级标题 字体 *** +正文+ * :粗体(星星之间无空格) *** +正文+ :斜体* *** * * +正文+ * * :粗斜体* **~ +正文+ :画线**(正文…

运维审计/堡垒机选型 2025:从 SSH 直连|堡垒机绕行的可见性到“命令+返回文本”的内容级证据

运维审计/堡垒机选型 2025:从 SSH 直连|堡垒机绕行的可见性到“命令+返回文本”的内容级证据在 2025 年多云、外包协同成为常态的运维环境下,企业在选型运维堡垒机/运维审计系统时,已不再仅仅关注“谁登录、从哪台…

[题解]P12025 [USACO25OPEN] Sequence Construction S

P12025 [USACO25OPEN] Sequence Construction S Ref:P12025 [USACO25OPEN] Sequence Construction S 题解 - Little_x_starTYJ 我们的构造要满足三个条件:\(1\le N\le 100\) \(\sum_i^N A_i=M\) \(\bigoplus_i^N \te…

【日记】我居然解决了三家运营商都没解决的问题(539 字)

正文这则日记是在家里写的,难得的,我出差回家了。并且,还和兄长的假期凑巧到了一起。这次出差负责解决一个支行的问题。说实话,我心里没什么底,因为支行反馈上来的情况相当怪。总体而言,就是十分正常的操作,而且…

深入解析:Jackson 入门:为什么它是 Java JSON 处理的首选?

深入解析:Jackson 入门:为什么它是 Java JSON 处理的首选?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

大模型在流行性乙型脑炎极重型预测及个体化诊疗专业的方案中的应用研究

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

markdown入门(复盘)

markdown入门(复盘)markdown入门(复盘) 标题 一级 ##二级 ###三级。。。(最多六级) 字体 hello hello hello ~~hello~~ 注意⚠️:都要用英文打符号 hello 插图超链接 链接 表格 直接右键生成吧! |xingming…

卡尔算法哈希表

一:有效的字母异位词part1题意:给出两个字符串,判断是否可以更改字符串内字母的顺序,从而使得两个字符串的单词一样。注意该题目认为两个相同字母顺序的字符串也是相同的。同样也返回true。即题目让我们判断两个字…

Rust 之二 各组件工具的源码、构建、配置、使用 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …