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). ...
随机推荐
- Jquery实现select左右栏的添加移除
首先是效果展示, 兼容火狐,IE6+,谷歌没测试有
- CDS
very nice artical talk about mergechangelog and cleardataset Delta and Data http://www.cnblogs.com/y ...
- tar命令的使用
tar格式,会打包成一个文件,可以对多个目录,或者多个文件进行打包 tar命令只是打包,不会压缩,打包前后大小是一样的 tar命令 -c //打包 -x //解压 -f //指定文件 ...
- windows下安装rabbitmq的php扩展amqp
最近研究rabbitmq队列,linux安装这样的软件一向都是很方便的,但是windows可能会比较麻烦,所以对windows的安装做个记录. windows上使用的php扩展为dll文件,首先去下载 ...
- Session阻塞 读写锁引发的小问题
引子 我们来看两个ajax方法,先后的问题,会有什么样的结果? Javascript: $(function () { //第一个 $.ajax({ type: "POST&qu ...
- web 调用WCF 每次都要重新编译才能正常使用 终于解决了
项目中不知从何时起出现了个奇怪的问题,每次运行web都要全部重新编译解决方案,否则单独编译web,总是会出现WCF 调用失败的情况(什么无法激活服务,什么协议对地址不可用啊,七七八八的问题),因为这个 ...
- flyby function
x=linspace(0.001, 3, 300); y=besselj(5,sqrt(1+x.^2));m=exp(5*i*atan(x.^-1));z=y.*m;plot(x,log(z),'r' ...
- Mybatis3.x与Spring4.x整合(转)
http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:cre ...
- 使用WP8最新的AudioVideoCaptureDevice类制作录像应用
WP8出来好一段时间了,新出的AudioVideoCaptureDevice类自定义功能比WP7的CaptureSource强大的多,但网上比较全面的中文实例还比较少,分享一个最近做的小实例给大家参考 ...
- c# 常量,变量
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...