解释一下标题,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); 的随笔的更多相关文章

  1. Unity Shader (二)Cg语言

    一.Cg基本数据类型 float 32位浮点数 half 16位浮点数 int 32位整型 fixed 12位定点数 bool 布尔数据 simpler* 纹理对象的句柄( the handle to ...

  2. cg语言学习&&阳春白雪GPU编程入门学习

    虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了“语义”的意思,非常感谢. 入门shader,我觉得可以先读3本书: ...

  3. 在CG/HLSL中访问着色器属性(Properties)

    在CG/HLSL中访问着色器属性 Shader在Properties块中访问材质属性.如果你想在一个着色程序中访问一些属性,你需要声明一个Cg/HLSL具有相同的名称和一个匹配的类型的变量. Prop ...

  4. C语言中的函数指针

    C语言中的函数指针 函数指针的概念:   函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...

  5. C语言中的函数、数组与指针

    1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函 ...

  6. R语言中数据结构

    R语言还是有点古老感觉,数据结构没有Python中那么好用.以下简单总结一下R语言中经常使用的几个数据结构. 向量: R中的向量能够理解为一维的数组,每一个元素的mode必须同样,能够用c(x:y)进 ...

  7. R语言中的数据处理包dplyr、tidyr笔记

    R语言中的数据处理包dplyr.tidyr笔记   dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了 ...

  8. R语言学习笔记1——R语言中的基本对象

    R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...

  9. R语言中的字符处理

    R语言中的字符处理 (2011-07-10 22:29:48) 转载▼ 标签: r语言 字符处理 字符串 连接 分割 分类: R R的字符串处理能力还是很强大的,具体有base包的几个函数和strin ...

随机推荐

  1. 设计模式15---Android 观察者模式(转载自:“http://blog.csdn.net/fangchongbory/article/details/7774044”)

    /* * 观察者模式 *      定义对象间的一种一个(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的 * 对象都得到通知并被自动更新 * * 当然, ...

  2. Python 3 Mysql 增删改查

    import pymysql import datainfo import time #获取参数 host = datainfo.host username = datainfo.username p ...

  3. Awk使用方法简介

    ==================AWK=================== AWK简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得 ...

  4. [leetcode] 1. Valid Palindrome

    leetcode的第一题,回文数判断. 原题如下: For example, "A man, a plan, a canal: Panama" is a palindrome. & ...

  5. Backup--完整备份会打破现有的日志备份链么?

    --问题描述: --对数据库有一个周期性数据库备份和事务日志备份的维护计划,在维护计划外有工作人员对数据库进行完整备份,该备份会打乱现有的日志备份链么? --===================== ...

  6. .net core 使用redis 基于 StackExchange.Redis

    一.添加引用包 StackExchange.Redis Microsoft.Extensions.Configuration   二.修改配置文件 appsettings.json   { " ...

  7. Nginx源码编译

    1. 概述 有时由于添加了自己编写的c++模块,或者改了源码的一些名称.配置什么的,需要自行编译nginx. 可以先下下来源码,然后需要的话就自己改下源码或增加模块,最后再编译成linux或者wind ...

  8. hihocoder1634 Puzzle Game

    题目链接:(vjudge) 戳我 和上面那个matrix 比较像. 大概题意就是给你一个n*m的矩阵,然后可以选择其中一个数字进行修改(当然也可以不修改),使得矩阵的最大子矩阵尽可能小.最后输出这个值 ...

  9. coderfoces D. Gourmet choice

      D. Gourmet choice time limit per test 2 seconds memory limit per test 256 megabytes   题目链接: https: ...

  10. Excel一对多查询(index+small+if)

    一.学习 一对多查询模式化数组公式: =INDEX(区域,SMALL(IF(条件,行号数组,4^8),ROW(A1))) 三键齐按(ctrl+shift+回车) 在具有多个符合条件的情况下,提取和匹配 ...