关于cg语言中求法向量 N=mul(worldMatrix_IT,normal); 的随笔
解释一下标题,N是变换到世界坐标后的法向量,worldMatrix_IT是变换矩阵worldMatrix的逆的转置矩阵,normal就是模型坐标的法向量。
对于点p,我们根据变换矩阵M(即worldMatrix)得到世界坐标的点为p',可以写为p'=Mp。在cg语言中就是p'.position=mul(worldMatrix,p.positon);。所以初读N=mul(worldMatrix_IT,normal);时,我有点纳闷,这个worldMatrix_IT是什么,为什么不用worldMatrix。我们来推导一下吧:
设一个顶点为P,其法向量为N,由和P无限相邻的两个点P1、P2可以得到一条和法向量垂直的切向量T,T=P1-P2。设M为变换矩阵,于是可以由变换的两个点P1'、P2'得到变换后的法向量T'。推导如下:
T'=P1'-P2'
T'=MP1-MP2
T'=M(P1-P2)
T'=MT
因为法向量和切向量垂直,于是可得:
N·T=0
NTT=0
M乘以M的逆矩阵M-1等于单位矩阵E,又因为任意矩阵乘以单位矩阵仍等于本身,所以:
NTET=0
NTMM-1T=0
NTM-1MT=0(互逆的矩阵可以交换)
NTM-1T'=0
因为变换后的法向量N'和切向量N'依旧垂直,所以:
N'TT'=0
N'T=NTM-1
N'=(NTM-1)T
N'=(M-1)TN
所以现在就能得出,法向量需要用变换矩阵M的逆的转置矩阵(M-1)T做变换才能得到,现在能理解N=mul(worldMatrix_IT,normal);了吧~
关于cg语言中求法向量 N=mul(worldMatrix_IT,normal); 的随笔的更多相关文章
- Unity Shader (二)Cg语言
一.Cg基本数据类型 float 32位浮点数 half 16位浮点数 int 32位整型 fixed 12位定点数 bool 布尔数据 simpler* 纹理对象的句柄( the handle to ...
- cg语言学习&&阳春白雪GPU编程入门学习
虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了“语义”的意思,非常感谢. 入门shader,我觉得可以先读3本书: ...
- 在CG/HLSL中访问着色器属性(Properties)
在CG/HLSL中访问着色器属性 Shader在Properties块中访问材质属性.如果你想在一个着色程序中访问一些属性,你需要声明一个Cg/HLSL具有相同的名称和一个匹配的类型的变量. Prop ...
- C语言中的函数指针
C语言中的函数指针 函数指针的概念: 函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...
- C语言中的函数、数组与指针
1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念: 函 ...
- R语言中数据结构
R语言还是有点古老感觉,数据结构没有Python中那么好用.以下简单总结一下R语言中经常使用的几个数据结构. 向量: R中的向量能够理解为一维的数组,每一个元素的mode必须同样,能够用c(x:y)进 ...
- R语言中的数据处理包dplyr、tidyr笔记
R语言中的数据处理包dplyr.tidyr笔记 dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了 ...
- R语言学习笔记1——R语言中的基本对象
R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...
- R语言中的字符处理
R语言中的字符处理 (2011-07-10 22:29:48) 转载▼ 标签: r语言 字符处理 字符串 连接 分割 分类: R R的字符串处理能力还是很强大的,具体有base包的几个函数和strin ...
随机推荐
- zuluCryt cli howto
1.解锁卷的命令. zuluCrypt-cli -o -d /dev/sdc1 -m blabla -e ro -f /home/keyFile zuluCrypt-cli -o -d /dev/sd ...
- Tango Java API常数
Tango Java API Constants常数 Constant Field Values常数字段值 Contents com.google.* com.google.* com.google. ...
- 编写高质量代码改善C#程序的157个建议——建议94:区别对待override和new
建议94:区别对待override和new override和new使类型体系应为继承而呈现出多态性.多态要求子类具有与基类同名的方法,override和new的作用就是: 如果子类中的方法前面带有n ...
- 【微服务架构】SpringCloud之Ribbon(四)
一:Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接 ...
- Android-Intent意图传递数据
Intent意图传递基本数据类型: OuterActivity 激活启动 OneActivity 用Intent携带基本数据类型: /** * Intent意图传递数据到另外一个Activity */ ...
- C++ 控制台编程
播放媒体文件 #include<windows.h> #program <mmsystem.h> #pragma comment(lib,"winmm.lib&quo ...
- RobotFramework中查询数据库相关
先要安装:robotframework-databaselibrary,并导入RIDE 封装“连接数据库”关键字,内容如下: 断开数据库:Disconnect From Database,没有参数 一 ...
- C++静态成员和非静态成员的区别和使用
C++静态成员和非静态成员的区别和使用 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员和静态方法. 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进 ...
- 在Linux安装ASP.Net Core的运行时(Runtime)
在部署的时候,如果您不想在您的Linux服务器上安装.Net Core SDK,您可以只安装Runtime,接下来我们看看该如何安装运行时Runtime. 下载运行时文件 下载页面:https://w ...
- a标签点击时跳出确认框
在做一些删除等的操作时,在跳转链接前,需要弹出一个确认框确认,避免误点. 方法一: <a href="http://www.baidu.com" onClick=" ...