首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正确变换曲面法线

正确变换曲面法线
EN

Stack Overflow用户
提问于 2012-05-15 00:06:07
回答 4查看 9.3K关注 0票数 6

根据OpenGL红皮书附录F,一个规则的三维变换矩阵M可以用来计算法向量上的作用,如:

代码语言:javascript
运行
AI代码解释
复制
normalTransformed = transpose(inverse(M)) * normal

然而,虽然与变换后的法线相关联的正交平面确实与变换后的曲面平行,但可能发生的情况是,变换后的法向量本身正指向与我预期相反的方向,即“进入”曲面,而不是“离开”曲面。

如果我想让normalTransformed指向正确的方向(也就是说,当它所连接的表面未被转换时,它所指向的方向相同),那么我应该如何从数学上做到这一点呢?

示例

假设我的曲面法线是(0,0,1),而我的变换是Z方向上10的平移。然后,变换矩阵M是:

1 0 0 0

0 1 0 0

0 0 1 10

0 0 0 1

转座子(反向(M))则是:

1 0 0 0

0 1 0 0

0 0 1 0

0 0 -10 1

适用于齐次坐标下的曲面法线(0,0,1),即(0,0,1,1),这给出:

normalTransformed = (0,0,1,-9)

从齐次坐标返回:

(0,0,-1/9)

正规化至长度1:

(0,0,-1)

它指向与原始法向量(0,0,1)相反的方向。

EN

回答 4

Stack Overflow用户

发布于 2012-05-15 01:23:32

应用于齐次坐标下的曲面法线(0,0,1),即(0,0,1,1)

好了,停在那儿。

如果你要把曲面法线看作齐次坐标,你用一个零作为W分量,而不是1。现在,你可能很快就会意识到你不能除以零,但这也是为什么你不对法线做齐次的数学。

正常不是一个位置,而是一个方向。方向没有位置,所以翻译它们是没有意义的。具有W=0的同构位置表示一个无限远的“位置”(这就是为什么您不能将它们分开)。无限远的位置与每一个有限的点都是无限远的。

因此,在无穷远处的位置就是一个方向:它不会改变方向,不管你从什么(有限)位置看它。

现在,如果您有一个4x4矩阵,并且需要通过它来转换一个法线,那么您只需要使用W=0,因为它可以解决数学问题。它去掉了矩阵的翻译成分。后变换W分量应完全忽略。

因此,在转换之后,您可以得到以下内容:

normalTransformed = (0,0,1,-9)

在忽略W组件之后,它变成:

normalTransformed = (0,0,1)

更有可能的是,你的正常人实际上并没有在正确的方向上开始。当然,在没有代码和数据的情况下,可以说的不多了,但假设输入是合法的,那么数学就可以工作。

另外,不要在着色器中做反/转置。在CPU上执行,并将生成的矩阵传递给着色器。

票数 19
EN

Stack Overflow用户

发布于 2012-05-15 15:17:59

问题是,您被w坐标除以,就好像您的正常值是一个点一样。(当使用w<0时,这种划分将逆转您的正常情况。)相反,您需要完全忽略w-coordinate:完全放弃它,而不是按照它进行除法。

你的法线不是一个点,它在技术上是一个协向量(这就是为什么它与点和向量不同的原因)。它实际上没有一个w-coordinate --添加它的唯一原因是为了方便使用现有的4x4矩阵例程。

如果确实添加了任意的w-coordinate,则具有给定法线的平面的齐次坐标。像法线一样,这样的平面也是由变换点的矩阵的逆转置来转换的(注意,用它的w-coordinate除以平面也是没有意义的--平面也不是点!)

如果法线是从三角形派生出来的,则三角形的平面应该具有这个法线--然而,法线显式缺乏确定该平面是哪个平面的w-coordinate。将任意的w添加到法线(无论是01还是其他什么)意味着选择带有该法线的任意平面,因此转换它将产生一个与转换的法线相同的任意平面;这就是为什么在用4x4矩阵进行转换后,需要忽略w

票数 2
EN

Stack Overflow用户

发布于 2012-05-15 04:33:22

Nicol Bolas在他的回答中所写的是绝对正确的,事实上,我不会重复这些概念。

但我在问题中注意到,有几点可能是有趣的。

首先,正规矩阵通常被定义为模型视图矩阵左上角3x3矩阵的逆的转置。这是因为法线不是用齐次位置来定义的,实际上,4x4矩阵是不必要的;如果您想使用整个模型视图矩阵,请按照Nicol Bolas的方向,但数学不变。(因为w是零)。

第二,你说过

,我希望normalTransformed指向正确的方向(也就是当它所连接的表面未被转换时所指向的相同方向),我应该如何从数学上做到这一点?

利用正态矩阵与模型变换进行相干变换(实际上,法矩阵是由模型视图矩阵导出的)。我可以从你的话中了解到,你想要的是正常而不是改变.实际上,你为什么要改变它?你可以直接使用“正常”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10596548

复制
相关文章
微软的这项新技术证明,深度学习还能更“深入”
计算机视觉已经是日常生活的一部分。借助这种技术,Facebook可以识别你上传到社交网络的照片上的人物;Google Photo能够自动在收藏行列中找出特定的图片,以及识别出各种各样的东西……这样的
新智元
2018/03/14
7260
微软的这项新技术证明,深度学习还能更“深入”
利用selenium webdriver下载不同类型的文件(pdf,txt等等)[通俗易懂]
很多时候你需要从网站上下载不同种类的文件,像是MS Excel file, MS Word File, Zip file, PDF file, CSV file, Text file, 等等。 如果手动下载,会弹出一个保存文件的对话框。
全栈程序员站长
2022/11/04
1.6K0
利用selenium webdriver下载不同类型的文件(pdf,txt等等)[通俗易懂]
是什么使你留在你的公司
之前离职的一个同事,是典型的技术型人才,前段时间跟他一起吃饭,得知他工作状况不是很理想(他在创业型团队,工作强度非常大,且做出来的东西得不到应有的认可,公司给他的报酬也不是很高),于是动心把他挖回来,跟两个领导打过申请,争取到了我能给他争取到的报酬后,跟同事商量,同事满口答应下来,并且很诚恳的跟我说,愿意回来;天不遂人愿,他提了离职申请后,他的现在的领导,决定给他股份(或期权),调整他的薪资,希望他能留下来;如此反复沟通了两三次,最后还是没能再回到我的团队;
芋道源码
2018/12/27
5090
什么使DevOps中的代码审查良好?[DevOps]
改善软件开发生命周期,向客户交付软件的速度以及该软件的质量都是DevOps的重要前提。这些是DevOps运动规定的工具和技术试图达到的目标。作为开发人员,感到很自由,可以快速进行更改,不仅可以更改源代码,还可以更改基础结构和配置代码。作为DevOps的从业者,目标是在质量与安全性之间实现平衡。如何?可以使用的一种工具是代码审查。
yyx
2019/12/24
9880
什么使DevOps中的代码审查良好?[DevOps]
【纯干货】用了这么多年的 SpringBoot 你知道什么是 SpringBoot 的 Web 类型推断吗?
用了这么多年的 SpringBoot 那么你知道什么是 SpringBoot 的 web 类型推断吗?
Java极客技术
2023/02/23
5560
【纯干货】用了这么多年的 SpringBoot 你知道什么是 SpringBoot 的 Web 类型推断吗?
微软的新技术使面部动作与语音片段更好同步
越来越多的研究表明,只要有足够大的语料库,几乎任何人的面部动作都可以与语音片段同步。今年6月,三星(samsung)的应用科学家详细介绍了一种端到端的模型,该模型能够在人的头颅中对眉毛、嘴、睫毛和脸颊进行动画处理。仅仅几周后,Udacity发布了一个系统,该系统可以从音频叙述中自动生成独立演讲视频。
AiTechYun
2019/10/10
5080
微软的新技术使面部动作与语音片段更好同步
用了多年盗版Windows的你,有没有觉得对不住微软?
非常有意思的一个问题,对于个人用户来讲微软的系统几乎讲正版的不是很多,小打小闹的公司基本上也不会在乎版本是不是正版的,如果按照软件全部的正版的话,小公司直接运转不下去任何公司的起步都会显得比较弱小,对于个人或者小公司微软公司也不会顾及,除非一些特殊的情况,微软在全球的推广策略是免费使用,对于大公司的版本基本上是不放过的,这就是微软公司的策略,先把产品利用普通大众给推广起来,然后利用版权从大公司弄钱。
程序员互动联盟
2019/06/20
6610
用了多年盗版Windows的你,有没有觉得对不住微软?
Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等
相信大家在刷算法题的过程中,好不容易想出来大概的思路,也知道去用哪个集合类,但各个集合类的一些命令都长得太像,很容易将他们弄错,并且在各集合之间的转化也是特别烦人,还有很多实用的函数都知道可以去用,但总是会忘记。
用户11369558
2024/12/24
1260
Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等
[Error] invalid use of incomplete type 使用了未定义的类型
今天在写奥特曼打大怪兽的时候,发现一个奇怪的问题,我定义了两个基类Ultraman和Monster,一个Monster的子类Boss,然后两个基类是有相互勾结的地方,它们都或多或少的使用了对方的类型进行定义自己,然后我在第一个类实现前面进行了另一个类的声明:
叶茂林
2023/07/30
6090
[Error] invalid use of incomplete type 使用了未定义的类型
7个高效的TypeScript工具类型,你会用了吗?
这些工具类型能让你的代码更清晰、更简洁,同时还能减少隐藏错误的可能性。今天我们就来聊聊TypeScript中的七个高效工具类型:keyof、ReturnType、Awaited、Record、Partial、Required 和 Omit。通过实例讲解,让你轻松掌握这些强大的工具类型。
前端达人
2024/06/26
8460
7个高效的TypeScript工具类型,你会用了吗?
使枚举类型的选项在VS的属性窗里显示为中文
我们自己做的组件,一般希望它的属性在设计时能够在属性窗里显示为中文,可以在属性上添加System.ComponentModel.DisplayNameAttribute标注达到这个目的。但是,枚举的选项如何以中文的形式显示在属性窗里呢?
明年我18
2019/09/18
1.2K0
使枚举类型的选项在VS的属性窗里显示为中文
用了天翼云,为什么FTP无法使用了?
最近因为公司举行云生态大会,节奏非常紧急,公众号断了几天,不管工作再忙,学习不能断,今天继续补上。
希望的田野
2019/09/24
2.6K0
用了天翼云,为什么FTP无法使用了?
意识理论大较量的结果究竟证明了什么
意识理论家长达五年的“对抗性合作”在观众面前展开了一场戏剧性的对决。它没有选出任何赢家,但它仍然可以声称取得了进展。
用户9861443
2023/09/02
4020
意识理论大较量的结果究竟证明了什么
apache占用了什么端口
今天想做PHP程序,结果启动Apache的时候控制台报443端口被占用。原因是我的虚拟机VMware占用443端口用于连接远程服务器的。其实出现这些状况很正常。因为不同的程序很有可能同时需要一个端口维持其服务。这里写给入门者告诉大家解决方法。
用户1448800
2021/08/16
9830
apache占用了什么端口
是什么使代码 “Swifty”? —— Safe
尽管编程语言是由其语法正式定义的,但实际上在实践中使用它们的方式还是可以由它们当前的约定来确定的。毕竟,就语法而言,大多数受“ C影响 ” 的语言看起来都非常相似,以至于您可以用几乎使它看起来像JavaScript,C#或C本身的方式编写Swift。
韦弦zhy
2020/03/20
8870
是什么使代码 “Swifty”? —— Safe
五种类型的渗透测试使潜在漏洞为零
一个渗透测试或笔测试是软件或硬件系统,寻求有意计划的攻击,以揭露可能违反系统的完整性,并最终损害用户的机密数据固有的安全漏洞。在这篇文章中,我们将讨论不同类型的渗透测试,以便您了解要覆盖的内容、估算工作量、高效执行。
鲸落c
2022/11/14
4640
是什么使代码 “Swifty”? —— Expressive
Swift的官方网站上的About页面列出了三个关键字: 安全(Safe):为了最大限度地减少开发人员的错误; 迅速(Fast):执行的速度要快; 表现力(Expressive):因为Swift
韦弦zhy
2020/03/20
6570
是什么使代码 “Swifty”? —— Expressive
科普帖:什么是组播?组播和单播的区别是什么?
作为IP传输三种方式之一,组播指的是报文从一个源发出,被转发到一组特定的接收者,相同的报文在每条链路上最多有一份。相较于传统的单播和广播,组播可以有效地节约网络带宽、降低网络负载,所以被广泛应用于IPTV、实时数据传送和多媒体会议等网络业务中。
IT运维技术圈
2022/06/27
19.7K0
科普帖:什么是组播?组播和单播的区别是什么?
是什么使代码 “Swifty”? —— Fast
Swift的官方网站上的About页面列出了三个关键字: 安全(Safe):为了最大限度地减少开发人员的错误; 迅速(Fast):执行的速度要快; 表现力(Expressive):因为Swift
韦弦zhy
2020/03/20
7680
是什么使代码 “Swifty”? —— Fast
大名鼎鼎的Requests库用了什么编码风格?
此外,PEP-8 推荐的用于连续行的编码风格毫无一点品味,绝不允许在 Requests 代码库用:
Python猫
2019/04/09
3630

相似问题

如何证明一组密码是一组明文的加密?

10

基于模拟的证明和基于游戏的证明有什么区别?

30

什么是安全西格玛证明的例子?

10

证明Dlog在泛型组模型中是困难的

10

什么时候人们更喜欢知识的证明而不是零知识的证明?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档