OpenGL法向量变换
OpenGL光照开启时,法向量用于决定特定顶点或面上接受到光照的多少。光照处理过程作用于观察坐标空间,因此,模型对象坐标系的法向量也需要使用GL_MODELVIEW矩阵变换到观察坐标系。
然而,法向量与顶点的变换方式不同。我们不能够简单将GL_MODELVIEW矩阵与法线相乘。设想顶点(0,0,0)的法向量(1,0,0)。如果GL_MODELVIEW矩阵为沿Y轴移动2个单位,顶点坐标将为(0,2,0)。不过,法线依旧为相同的(1,0,0),而不是(1,2,0)。
为了理解法向量如何变换到观察空间,将法线作为平面方程式的系数,它与平面垂直。

OpenGL法向量
假设一个具有三个顶点的三角形:V1-V2-V3,该齐次平面的法线为
。(对于欧式空间,法线为
。)如果我们将三角形看做齐次平面,该平面方程为:(将x、y、z替换为x/w、y/w、z/w,接着我们在两边同时乘以w)

因为3个顶点在平面上,当我们将这些点带入方程时,该平面方程也是正确的。例如,对于点
,满足:
平面方程的等价矩阵形式为:

平面方程将转置法线(nT)与顶点相乘。
现在,我们通过在中间插入GL_MODELVIEW矩阵M-1M来修改上面的方程式以获取发现两变换方程:(下列方程式依旧等价于上面的方程式,因为M-1M为单位矩阵。)

就像你看到的那样,由于方程式也发生了变换,上述方程式右侧的
为观察空间的变换等电,左侧的
为观察空间中的法向量。这就是”在观察空间中,变换后的顶点
在变换后的平面
上“。
因此,使用GL_MODELVIEW矩阵M将法线从模型对象空间变换到观察空间,为: 
或者,将右乘变为左乘方式,得到:

英文原文:http://www.songho.ca/opengl/gl_normaltransform.html
OpenGL法向量变换的更多相关文章
- opengl视图变换 投影变换推导
视图变换在opengl中,视图变换的输入是:(1)眼睛位置(或者说相机位置)eys:(2)眼睛朝向的中心center,(就是眼睛朝哪里看);(3)头的方向up.任何一点经过视图变换后都会转化到眼睛坐标 ...
- SharpGL学习笔记(七) OpenGL的变换总结
笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...
- OpenGL矩阵类(C++)
概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...
- 浅谈OpenGL变换矩阵
OpenGL中使用的矩阵全为列向量为主的矩阵. 参考OpenGL变换网站为 http://www.songho.ca/opengl/gl_transform.html 1.什么是GL_MODELVI ...
- OpenGL矩阵类(C++) 【转】
http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...
- 一文详解 OpenGL ES 3.x 渲染管线
OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...
- OpenGL判断一个点是否可见
关于OpenGL中判断一个点是否可见,可以分成两种情况讨论:点在2D空间中和3D空间中的时候.并且"在2D空间中"可以看作"在3D空间中"的特殊情况. 温馨提示 ...
- SharpGL学习笔记(八) 矩阵堆栈和变换的综合例子: 机器人
我们先引入关于"矩阵堆栈"的官方说法: OpenGL的矩阵堆栈指的就是内存中专门用来存放矩阵数据的某块特殊区域.实际上,在创建.装入.相乘模型变换和投影变换矩阵时,都已用到堆栈操作 ...
- GLSL语言变量
转自:http://www.th7.cn/Program/cp/201208/87679.shtml GLSL语言内置的变量,包括内置的顶点属性(attribute).一致变量(uniform). ...
随机推荐
- JDK8+Dubbo2.5.2实践
几年前就听说过Dubbo的大名,今天由于工作需要,研究一下. 从网上找了一篇文章,非常靠谱,并且提供了简单的示例代码,基本上可以跑起来. 文章地址: http://www.cnblogs.com/Ja ...
- zookeeper+dubbo-admin开发dubbo应用
前面的章节中我们已经安装好了zookeeper,tomcat了.今天我们来实现一个完整的从dubbo消息产生到消费的完整流程. 1.dubbo api 2.dubbo consumer 消费者 3.d ...
- sigaction和sigqueue
sigaction函数相对于siganl函数控制信号的发送要更加精确一些,其函数原型为: int sigaction(int signum, const struct sigaction *act, ...
- AudioUnit 用法
1.描述音频单元 AudioComponentDescription desc; desc.componentType = kAudioUnitType_Output; desc.componentS ...
- linux下查看进程状态
1.查看进程的启动时间和执行时间 使用 ps 命令 :#ps -A -opid,stime,etime,args $ ps -A -opid,stime,etime,args PID STIME EL ...
- APK签名是如何生成的
零.前言本文以支付宝手机客户端为例,进行剖析到支付宝官网下载当前最新版本:8.0.1 (2014-01-28)文件名为 alipay_wap_main.apkMD5 摘要为 69820edb3cd13 ...
- python selenium与自动化
大学是学习过java,但是工作中没用,忘完了,而且哪怕以后有了机会,就是很不愿意去学这个语言,开始喜欢上了c#,但是随着学的升入,感觉.net太庞大了,要学习那么多,总感觉我学这个要做什么,感觉要做的 ...
- mediawiki安装
下载wiki,我用的mediawiki-1.23.6 版本. 服务器是window2008 r2 的. 下载xampp,或者wamp都可以,我的用的禅道安装的xampp,解压后直接放在htdocs目录 ...
- Linux下使用NMON监控、分析系统性能
一.下载nmon. 根据CPU的类型选择下载相应的版本:http://nmon.sourceforge.net/pmwiki.php?n=Site.Downloadwget http://source ...
- 【C】制作简单的时钟减法程序
#include <stdio.h> #include <stdlib.h> #include <string.h> #define ARGC_NUM 3 #def ...