推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变,取决于变换的类型。使用逆转置矩阵,可以安全地解决该问题,而无须陷入过度复杂的计算中。

法向量变化规律

  1. 平移变换不会改变法向量,因为平移不会改变物体的方向。 
  2. 旋转变换会改变法向量,因为旋转改变了物体的方向。
  3. 缩放变换对法向量的影响较为复杂。如上图,最右侧的图显示了立方体先旋转了45度,再在y轴上拉伸至原来的2倍的情况。此时法向量改变了,因为表面的朝向改变了。但是,如果缩放比例在所有的轴上都一致的话,那么法向量就不会变化。

模型矩阵的逆转值矩阵可以用来变换法向量。实际上,在某些特殊情况下,可以通过模型矩阵来确定物体变换后的法向量。比如说,当物体在旋转时,可以用旋转矩阵直接乘以法向量,就能获得旋转后的法向量。总之,计算变换后的物体表面的法向量方向时,是求诸于模型矩阵自身,还是模型矩阵的逆转值矩阵,取决于模型矩阵中已经包含的变换类型(平移、旋转或缩放)。

直接通过模型矩阵自身求变换后的法向量。如果模型矩阵中已经包含了平移变换,法向量就会被当作顶点坐标平移,从而导致法向量与原有的表面朝向不一致。比如说,一个法向量是(1,0,0),沿Y轴平移2.0个单位后,就变成了(1,2,0)。事实上,如果你从4×4的模型矩阵的左上角抽出3×3的子矩阵,然后乘以法向量,就可以避免该问题。如下所示,4*4的模型矩阵:

由于3×3的子矩阵实际上包含了旋转矩阵和缩放矩阵的信息,我们来逐一考虑。

  • 如果只进行旋转操作:

你可以使用模型矩阵的3×3子矩阵对法向量进行变换。如果在变换前法向量已经归一化了,那么变换后的法向量无须再归一化处理。

  • 如果只进行缩放操作(且缩放因子相同):

你可以使用模型矩阵的3×3子矩阵对法向量进行变换。但是,变换后的法向量需要再次归一化处理。

在这种情况下,当你只进行缩放操作且缩放因子相同时,这意味着X轴、Y轴和Z轴的缩放因子是一致的。比如,你希望以一致的缩放因子2.0进行缩放,那么就需要将法向量 3*3 子矩阵 变换后归一化,这时,即使物体的尺寸发生了变化,但是其形状并未改变。

  • 如果进行了缩放操作(但缩放因子不同):

必须使用模型矩阵的逆转值矩阵对法向量进行变换。变换后的法向量必须再次归一化处理。原因如下:

如下图使一个矩形物体(左图)沿Y轴拉伸2.0倍,拉伸后的形状如右图所示。这里,为了获得变换后的法向量,我们试图使用模型矩阵乘以原先的法向量(1,1,0)。但是,得到的结果是(1,2,0),并不垂直于拉伸后的物体表面了。

推导

令模型矩阵为M,令初始的法向量为n,令变换矩阵为M',也就是用来正确变换法向量n的矩阵,令垂直于n的向量为s,令变换后的法向量为n',令垂直于n'的向量为s'

等式一、二

n' =  M' *  n

s' =  M * s

n和s,以及 n'和 s'的关系 ,如下:

现在,我们就来计算M',使得n'和s'的相对角度保持垂直。我们知道两个垂直矢量的点积是0,点乘操作使用点运算符“ · ”表示,所以有:

 n'·  s'=  0

将等式一、二代入并重写上式

从上图中可以看出,M'就是通过转置M的逆矩阵得到的,或者说,M'就是M的逆转置矩阵。因为M已经可能包含了上面列举过的三种变换情况,所以计算M的逆转置矩阵并乘以法向量,就可以获得正确的结果,因此,这才是对法向量进行变换的最佳方法

另,计算逆转置矩阵可能会比较耗时,如果你非常确定物体的变换只包含上述(1)(2)的情形,也可以简单地使用上述 模型矩阵的3×3子矩阵 来对处理法向量。

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

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

相关文章

栈和队列的相互实现

1. 两个队列实现栈. - 力扣(LeetCode) 队列的特点是先进先出,而栈的特点是后进先出(先进后出),也就是说重点在于利用两个队列来改变“出”的顺序。 假设我们在进行入栈操作的时候将数据依次入到一个队列中…

python如何单步调试

Python怎么单步调试?下面给大家介绍一下单步调试: 方法一:执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试,这时你能够看看帮助。 方法二:在所调试程序的开头中:import pdb 并在你…

民航电子数据库:数据库的备份与恢复

目录 前言备份库级逻辑备份示例 恢复库级的逻辑恢复示例 前言 民航电子数据库的备份与恢复 备份 库级逻辑备份 备份目标库下所有的对象 。 因此 ,库级逻辑备份需要由备份库的管理员(SYSDBA)登录至备份目标库进行操作。 语法格式 &#xff1…

商家转账到零钱怎么开通?一步步教你玩转微信营销新利器

在数字化营销日新月异的今天,微信支付凭借其便捷、安全的特点,成为了商家不可或缺的支付工具。而其中的“商家转账到零钱”功能,更是为商家提供了一个全新的营销利器。今天,我们就来详细解读一下如何开通这一功能(我处…

怎么制作流程图?介绍制作方法

怎么制作流程图?在日常生活和工作中,流程图已经成为我们不可或缺的工具。无论是项目规划、流程优化,还是学习理解复杂系统,流程图都能帮助我们更直观地理解和表达信息。然而,很多人可能并不清楚,其实制作流…

通过 Java 操作 redis -- zset 有序集合基本命令

目录 使用命令 zadd,zrange 使用命令 zcard 使用命令 zrem 使用命令 zscore 使用命令 zrank 关于 redis zset 有序集合类型的相关命令推荐看Redis - Zset 有序集合 要想通过 Java 操作 redis,首先要连接上 redis 服务器,推荐看通过 Jav…

探索智慧推理:线上剧本杀小程序引领新潮流

随着科技的飞速发展,线上剧本杀小程序作为一种新兴的数字娱乐形式,正以其独特的魅力引领着新潮流,并在内容创造上展现出无限的潜力。这种融合了角色扮演、推理解谜和社交互动的游戏模式,不仅为用户带来了沉浸式的体验,…

物流单打印机怎么调格式距离,佳易王物流托运单管理系统软件打印单据左边距调节教程

物流单打印机怎么调格式距离,佳易王物流托运单管理系统软件打印单据左边距调节教程 一、前言 以下软件操作教程以,佳易王物流单打印管理软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、佳易王物流单管理系统打印…

Whistle Web Debugging Proxy介绍及使用

大家好,今天继续给大家分享一款抓包工具,这款抓包工具是网页的形式,方便多人访问同时维护。Whistle Web Debugging Proxy是一个用于HTTP、HTTPS、WebSocket等网络协议的跨平台调试工具。它可以帮助开发者对网络请求进行捕捉、分析、修改和重定…

【OpenGL的数学01】从窗口空间计算视空间

文章目录 一、说明二、定义三、来自gl_FragCoord四、来自gl_FragCoord的XYZ4.1 从窗口到ndc4.2 从NDC到剪辑4.3 从剪辑到眼睛4.4 GLSL示例 五、从gl_FragCoord的XYZ优化方法 一、说明 本文将解释如何在给定窗口空间顶点位置的情况下重新计算眼空间顶点位置。以及相反的计算。其…

【Obsidian】视频笔记插件Media Extended的强大功能

我将开设一个专栏,介绍当下最好用的笔记软件Obsidian的使用经验和技巧。欢迎持续关注。 摘要:本文将首先向您介绍一款功能强大的笔记软件Obsidian,然后为您详细解析Obsidian的一款实用插件——Media Extended,帮助您更好地利用Obs…

如何在Mac 电脑上安装 Homebrew

1、打开终端应用程序 在终端中输入以下命令并回车: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 这个命令会自动下载并运行 Homebrew 的安装脚本。 系统可能会提示您输入管理员密码,请输入您的 Mac 登录…

易图讯科技三维电子沙盘系统

深圳易图讯科技有限公司(www.3dgis.top)创立于2013年,专注二三维地理信息、三维电子沙盘、电子地图、虚拟现实、大数据、物联网和人工智能技术研发,获得20多项软件著作权和软件检测报告,成功交付并实施了1000多个项目&…

十、Redis内存回收策略和机制

1、Redis的内存回收 在Redis中可以设置key的过期时间,以期可以让Redis回收内存,循环使用。在Redis中有4个命令可以设置Key的过期时间。分别为 expire、pexpire、expireat、pexpireat。 1.1、expire expire key ttl:将key的过期时间设置为tt…

QTreeView学习 branch 虚线设置

1、方法一&#xff1a; #include <QStyleFactory> ui.treeView->setStyle(QStyleFactory::create("windows")); 2、方法二&#xff1a; QString strtyle2 R"( QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/TreeViewDe…

【计算机毕业设计】用于日语词汇学习的微信小程SSM

日语词汇学习小程序是高校人才培养计划的重要 组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。本学生所在学院多采用半手工管理日语词汇学习小程序的方式&#xff0c;所以有必要开发日语词汇…

Qt---窗口系统

一、QMainWindow QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08;menu bar&#xff09;、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget) 1. 菜单栏(最多有一个) QMenuBar *bar…

【Python基础】装饰器(3848字)

文章目录 [toc]闭包什么是装饰器装饰器示例不使用装饰器语法使用装饰器语法 装饰器传参带参数的装饰器类装饰器魔术方法\__call__()类装饰器示例带参数类装饰器property装饰器分页操作商品价格操作 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&…

Spring MVC(建立连接 + 请求)

文章目录 一、建立客户端和服务器的连接二、如何构造请求&#xff08;传参&#xff09;2.1 构造请求方式 参数通用注解2.2 传递单个参数2.3 传递多个参数2.4 传递数组/集合2.5 传递对象2.6 传递JSON 三、相关的其他请求操作3.1 获取URL中的参数 PathVariable3.2 上传文件 Requ…

maven找不到依赖,in offline mode

问题描述&#xff1a; [ERROR] Plugin org.jetbrains.kotlin:kotlin-maven-plugin:1.2.71 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.jetbrains.kotlin:kotlin-maven-plugin:jar:1.2.71: Cannot access aliyunmaven (ht…