使用世界变换的逆转置矩阵对法线进行变换

法向量变换细节记录

最近在做法向量变换的时候,踩了两个坑,记录一下相关的知识点

法向量做变换,最后一位是补0

我们知道,顶点在做变换的时候最后一位是 1.0,法线最后一位是补0.0

vec3 normCurrent = (getMatrixWorld() * vec4(normCurrent, 0.0)).xyz; // 法线变换
vec3 pointCurrent = (getMatrixWorld() * vec4(pointCurrent, 1.0)).xyz; // 顶点变换

这主要是因为,将法线的最后一位设为0,可以消除位移对法线的影响;

首先,法向量只是一个方向向量,不能表达空间中的特定位置。同时,法向量没有齐次坐标(顶点位置中的w分量)。这意味着,位移不应该影响到法向量。因此,如果我们打算把法向量乘以一个模型矩阵,我们就要从矩阵中移除位移部分,只选用模型矩阵左上角3×3的矩阵(注意,我们也可以把法向量的w分量设置为0,再乘以4×4矩阵;这同样可以移除位移)。对于法向量,我们只希望对它实施缩放和旋转变换。

aed9dced685f2594a39fe30f3b4528ba

使用世界变换的逆转置矩阵对法线进行变换

当我拥有物体坐标系下的法线,我想将其变换到世界坐标系,只需要乘一下model矩阵就可以了吗,答案是否定的,我们可以看一下这张图,当模型发生了不等比缩放的时候:

CamScanner 06-27-2024 16.22_02

此时对法向量应用相同的变换,得到的法向量不再垂直于表面。(注意:等比缩放不会破坏法线,因为法线的方向没被改变,仅仅改变了法线的长度,而这很容易通过标准化来修复),法向量就不会再垂直于对应的表面了,这样光照就会被破坏。

那应该怎么对法向量进行变换呢,请看下面的推导,引用知乎上的回答:

image-20240627164312153

refer

  • https://learnopengl-cn.github.io/02 Lighting/02 Basic Lighting/
  • https://www.zhihu.com/question/27739027

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NodeJs】入门

目录 一、前导 二、 url模块 三、path模块 四、buffer模块 五、fs模块 六、stream流模块 七、os模块 八、crypto模块 九、util模块 十、http模块 nodejs官网 Node.js — 在任何地方运行 JavaScript nmp是Node.js包管理器,用来安装各种库、框架和工具&…

基于STM32的八位数码管显示和闹钟计时【Proteus仿真】

某鱼:两栖电子 一、系统功能 采用矩阵键盘,按下对应的数字再按下确认按键,数码管会显示自己输入的数字,如果按错可以使用删除按钮进行删除。点击计时按钮可以显示当前的时间。 二、使用器件 DS1302实时时钟芯片,8位数…

Mac虚拟机软件有什么用?

随着苹果M系列芯片电脑的推出,虚拟机的使用变得越来越流行。不同于苹果以往的Intel处理器电脑,其M系列芯片电脑无法安装双系统。如果要使用非macOS系统,可以通过创建虚拟机系统的方式实现。那么,虚拟机软件有什么作用和用途&#…

DP(动态规划)【3】 最长公共子序列 最长回文子串

目录 1.最长公共子序列 状态转移方程需要二维数组,1-dim已经不太够了 又是这个问题:如何读入字符串 2.最长回文子串 1.最长公共子序列 状态转移方程需要二维数组,1-dim已经不太够了 这里dp[i][j]是说S的前i位与T的前j位公共序列&#xff…

韩顺平0基础学java——第34天

p675-689 UDP网络编程 1.类 DatagramSocket和 DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序。 2.UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。 3.DatagramPacket对象…

FastAPI教程III

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 这部分暂无需求的没有记录,仅放置标题。 依赖项 安全性 中间件 你可以向FastAPI应用添加中间件。 ”中间件“是一个函数,它在每个请求被特定的路径操作处理之前,以及在每个…

植物大战僵尸融合版最新版2024蓝飘飘fly

亲爱的花园守护者们,是否已经厌倦了传统塔防游戏的老套模式?是否渴望在熟悉的《植物大战僵尸》中寻找全新的刺激体验?那么,让我们一起走进《植物大战僵尸融合版》的异想世界,开启一场别开生面的园艺之战吧!…

区间动态规划——最长回文子序列长度(C++)

把夜熬成粥,然后喝了它。 ——2024年7月1日 书接上回:区间动态规划——最长回文子串(C)-CSDN博客,大家有想到解决办法吗? 题目描述 给定一个字符串s(s仅由数字和英文大小写字母组成&#xff0…

以太网交换机原理

没有配置,比较枯燥,二可以认识线缆, 三比较重要,慢慢理解,事半功倍。 各位老少爷们,在下给大家说段以太网交换机原理,说得不好大家多多包涵,说得好呢,大家叫个好&#x…

Debugging using Visual Studio Code

One of the key features of Visual Studio Code is its great debugging support. VS Code’s built-in debugger helps accelerate your edit, compile, and debug loop. Debugger extensions VS Code 内置了对 Node.js 运行时的调试支持,可以调试 JavaScript、TypeScript…

Web3 前端攻击:原因、影响及经验教训

DeFi的崛起引领了一个创新和金融自由的新时代。然而,这种快速增长也吸引了恶意行为者的注意,他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上,但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection 论文链接:http://arxiv.org/abs/2406.03459 代码链接:https://github.com/Atten4Vis/LW-DETR 一、摘要 介绍了一种轻量级检测变换器LWDETR,它在实时物体检测方面超越…

matrixone集群搭建、启停、高可用扩缩容和连接数据库

1. 部署 Kubernetes 集群 由于 MatrixOne 的分布式部署依赖于 Kubernetes 集群,因此我们需要一个 Kubernetes 集群。本篇文章将指导你通过使用 Kuboard-Spray 的方式搭建一个 Kubernetes 集群。 准备集群环境 对于集群环境,需要做如下准备&#xff1a…

数据结构-期末复习题

数据结构-期末复习题 一、选择题 1、在数据结构中,与所使用的计算机无关的是数据的( ) 结构。 A. 存储B. 物理C. 逻辑D. 物理和存储 【答案】C 【解析】暂无解析2、算法分析的两个主要方面是 ( )。 A. 正确性和简单性B. 可读性和文档性C. 空间复杂度…

测评推荐:企业管理u盘的软件有哪些?

U盘作为一种便携的存储设备,方便易用,被广泛应用于企业办公、个人学习及日常工作中。然而,U盘的使用也带来了数据泄露、病毒传播等安全隐患。为了解决这些问题,企业管理U盘的软件应运而生。 本文将对市面上流行的几款U盘管理软件…

【SQLmap】常用命令

文章目录 实际使用案例常用命令基本命令数据库指纹识别用户信息用户权限数据库枚举数据导出密码哈希操作系统命令执行文件操作代理和网络参数指定保存恢复自动搜索注入智能模式等级设置自动注入WAF 绕过杂项帮助和支持 SQLmap 是一款开源的自动化 SQL 注入检测和利用工具&#…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句,从而获取、修改或删除数据库中的数据。 具体细节如下: 攻击向量&…

【Spring Boot】Java 持久层 API:JPA

Java 持久层 API:JPA 1.Spring Data1.1 主要模块1.2 社区模块 2.JPA3.使用 JPA3.1 添加 JPA 和 MySQL 数据库的依赖3.2 配置数据库连接信息 4.了解 JPA 注解和属性4.1 常用注解4.2 映射关系的注解4.3 映射关系的属性 5.用 JPA 构建实体数据表 1.Spring Data Spring…

VMware虚拟机迁移:兼用性踩坑和复盘

文章目录 方法失败情况分析:参考文档 方法 虚拟机关机,整个文件夹压缩后拷贝到新机器中,开机启用即可 成功的情况: Mac (intel i5) -> Mac (intel i7)Mac (intel, MacOS - VMware Fusion) -> DELL (intel, Windows - VMw…

flask的基本使用2

上一篇我们介绍了基本使用方法 flask使用 【 1 】基本使用 from flask import Flask# 1 实例化得到对象 app Flask(__name__)# 2 注册路由--》写视图函数 app.route(/) def index():# 3 返回给前端字符串return hello worldif __name__ __main__:# 运行app,默认…