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法向量变换的更多相关文章

  1. opengl视图变换 投影变换推导

    视图变换在opengl中,视图变换的输入是:(1)眼睛位置(或者说相机位置)eys:(2)眼睛朝向的中心center,(就是眼睛朝哪里看);(3)头的方向up.任何一点经过视图变换后都会转化到眼睛坐标 ...

  2. SharpGL学习笔记(七) OpenGL的变换总结

    笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...

  3. OpenGL矩阵类(C++)

    概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...

  4. 浅谈OpenGL变换矩阵

    OpenGL中使用的矩阵全为列向量为主的矩阵. 参考OpenGL变换网站为  http://www.songho.ca/opengl/gl_transform.html 1.什么是GL_MODELVI ...

  5. OpenGL矩阵类(C++) 【转】

    http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...

  6. 一文详解 OpenGL ES 3.x 渲染管线

    OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...

  7. OpenGL判断一个点是否可见

    关于OpenGL中判断一个点是否可见,可以分成两种情况讨论:点在2D空间中和3D空间中的时候.并且"在2D空间中"可以看作"在3D空间中"的特殊情况. 温馨提示 ...

  8. SharpGL学习笔记(八) 矩阵堆栈和变换的综合例子: 机器人

    我们先引入关于"矩阵堆栈"的官方说法: OpenGL的矩阵堆栈指的就是内存中专门用来存放矩阵数据的某块特殊区域.实际上,在创建.装入.相乘模型变换和投影变换矩阵时,都已用到堆栈操作 ...

  9. GLSL语言变量

    转自:http://www.th7.cn/Program/cp/201208/87679.shtml   GLSL语言内置的变量,包括内置的顶点属性(attribute).一致变量(uniform). ...

随机推荐

  1. 关于<form>标签

    <form>用于为用户输入创建HTML表单,表单用于向服务器传输数据 form是块级元素,其前后会产生折行 <form>包含: 1.input元素:(根据不同的type属性,输 ...

  2. 安装了简易版XP系统后不能安装IIS的解决办法

    第一步 找到C:\WINDOWS\inf文件夹中的sysoc.inf文件,在 [Components]区域中的NetOC=netoc.dll,NetOcSetupProc,netoc.inf,,7和c ...

  3. mybatis学习

    什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  4. Xcode清除缓存、清理多余证书

    Xcode清除缓存.清理多余证书 1.删除Xcode中多余的证书provisioning profile 手动删除: Xcode6 provisioning profile path: ~/Libra ...

  5. MySQL与Oracle的主要区别

    Mysql与Oracle区别 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2. ...

  6. 【物联网应用与维护】基于SQL sever 2008 R2的数据库定时处理

    --SQLServer : --1.打开[SQL Server Management Studio],在[对象资源管理器]列表中选择[SQL Server 代理]: --2.鼠标右击[SQL Serv ...

  7. Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path 解决办法

    返回数据解析错误 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT ...

  8. Jquery和Javascript 实际项目中写法基础-弹出窗和弹出层 (4)

     一.实际项目中有很多如下界面效果.    二.该效果可以归结为弹出窗或者弹出层来实现的,为什么这么说?看如下代码:      <!DOCTYPE html> <html> & ...

  9. <转>你相信外星人的存在吗

    ​ 来自为知笔记(Wiz)

  10. Hibernate 开发流程

    Hibernate内部分装的技术:JDBC(Java Data Base Connectivity), JTA(Java Transaction API) , JNDI(Java Naming and ...