我是靠谱客的博主 甜甜寒风,最近开发中收集的这篇文章主要介绍2.5 法线向量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

向量,是有大小和方向的量。而法线向量则是垂直于某个表面的方向向量。

法线向量可以用来干什么?物体的法线向量定义了它的表面在空间中的方向。这个方向能干什么用?定义了它相对于光源的方向。

举个例子,镜子可以通过反射,改变光的传播方向。拿着镜子朝着阳光,然后在墙壁上就可以看到一个被反射的光圈。小时候,拿着镜子,反射太阳光,不断的调整镜子的朝向,使得最后镜子反射的光线, 射入到某个女生的眼睛里去,然后我还洋洋得意,直到女生骂我几句,我还要反射…

如何描述镜子的朝向呢?在OpenGL中,就是用这个法线向量来描述。然后当太阳光线的入射方向知道后,OpenGL就可以决定镜子如何反射阳光了。

知道了法线向量表示物体的朝向。那OpenGL中如是表示法线向量的呢?OpenGL中,通过给多边形的顶点,指定法线向量。当这个多边形为平表面的时候,各个顶点的法线向量是相同的,当这个多边形为曲面的时候,各个顶点的法线向量不完全相同。具体使用的函数叫glNormal*()函数。使用例子如下:

glBegin(GL_POLYGON);
    glNormal3fv(n0);
    glVertex3fv(v0);
    glNormal3fv(n1);
    glVertex3fv(v1);
    glNormal3fv(n2);
    glVertex3fv(v2);
glEnd();

这样,将顶点0 v0 的法线向量指定为 n0,顶点1 v1的法线向量指定为 n1,顶点2 v2的法线向量指定为n2。

void glNormal3{bsidf}(TYPE nx, TYPE ny, TYPE nz);
void glNormal3{bsidf}v(const TYPE *v);

这个函数的参数,是(nx, ny, nz)组成的,(nx, ny, nz)也可以表示为一个三维坐标点。但是这里表示的法线向量,是指从坐标原点(0, 0, 0),指向点(nx,ny,nz)的向量。

法线向量的方向

一个平面有两侧,每一侧各有一个法线向量,它们指向相反的方向。按照约定,指向表面外侧的那条向量就是它的法线。如果想反转模型的内侧和外侧,只要把所有的法线向量从(x,y,z)修改为(-x, -y, -z)。

法线向量的大小

由于法线向量只表示方向,因此它的长度无关紧要。法线可以指定为任意长度,但是在执行光照计算之前,它的长度会转换为1(长度为1的向量称为单位向量或规范化的向量)。一般而言,我们应该提供规范化的法线向量。规范化法线向量的计算很简单,只要拿各个分量,除以法线的长度即可。

线=x2+y2+z2

法线向量的大小,在不规则模型变换的过程中,会发生变化。发生变化了,怎么办呢?只要启用OpenGL的自动对法线向量规范化的功能。启用这个功能,调用函数glEnable(GL_NORMALIZE),这样法线就自动规范化了,长度为1了。

在只涉及旋转和移动的变换中,法线向量能够保持它的规范化。

而如果提供了单位长度的法线,并且只执行了均匀的缩放(也就是说,在x、y和z方向上使用相同的缩放因子),就可以使用glEnable(GL_RESCALE_NORMAL),用一个常量因子(从模型视图变换矩阵得出)对法线进行缩放,使它们在变换之后,恢复为单位长度。

要注意,自动规范化或者重新缩放,一般都需要额外计算,因此可能会降低应用程序性能。使用GL_RESCALE_NORMAL对法线进行均匀缩放通常比使用GL_NORMALIZE进行完整的规范化开销更小,因为它只进行了一个乘法运算,而GL_NORMALIZE进行了开方,加法,平方运算。默认情况下,法线的自动规范化和均匀缩放操作都是禁用的。

最后

以上就是甜甜寒风为你收集整理的2.5 法线向量的全部内容,希望文章能够帮你解决2.5 法线向量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部