3D变换中法向量变换矩阵的推导

原创 2004年06月23日 01:36:00

3D变换中法向量变换矩阵的推导<?XML:NAMESPACE PREFIX = O />

潘李亮 2003-11-23

xheartblue@etang.com

 

在一个3D几何管道中,输入的顶点要经过一系列的变换,最终变换到一个投影空间里来,去掉最后的一个Z-坐标后就是一个规格化的2D的屏幕坐标。变换通常分成两个步骤,一是视图/模型变换(D3D里把这个分开成了两个变换世界变换和视图变换),二是投影变换Project.

当我们不去为一个顶点指定一个法向量的时候,一个多边形的顶点的法向量会由系统自动计算生成,计算的方法是由交成这个顶点的两条边做个叉积(叉积的时候注意叉积的方向),这个步骤通常在变换到视图空间后进行的。所以通常情况下我们是没有必要关心法向量是如何变换到视空间中来的。(为何是视图空间?而不是投影完成后的投影空间?原因是光照等计算都是在需要视图空间中的参数进行的。投影空间中的坐标只是为了裁剪和Z-Test用的)。

那么何时需要我们自己去关心法向量是如何变换的呢?这个谁也说不上来。但是肯定是需要的,比如你自己写一个Vertex Shader的时候,也许你需要用到法向量,这时就需要你用正确的变换方法把它变换到视图空间中来------当然你自己如果要写一个软件渲染器的话……。下面我先来用数学公式严密的推导出变换公式,再来解释一些其他的误区。

假设:我们的Model View变换矩阵为<?XML:NAMESPACE PREFIX = V /> , 为世界空间中的法向量, 为世界空间中的两个顶点,两个顶点所在的平面和 垂直。则我们很快就有如下的关系 ,即 的点积为零。在这里提醒大家一下。点积也可以看做是一种运算。所以我们把它写 ---------1)。( 在这里表示矩阵相乘, 的转置矩阵,下同)。

如果我们标记 变换到视空间中的点和对应的法向量,同理我们也有 --------2

 ----------3

联立 123得:

 

到这里我们已经得到法向量的变换公式为 。其中 Model View变换矩阵。(注意,不要把投影矩阵也乘上去)。

我们在使用法向量变换的时候最大的一个误区就是直接把Model View变换矩阵 当成法向量变换矩阵使用,而且肯定有人还曾经认为这是正确的,他们的理由有两个:一是法向量也是一个Vector。而Vertics表示的也是一个Vector。为什么不是同一个矩阵?二是我用 Model View矩阵去变换法向量的时候,结果看上去的也是正确的。对于第一种理由,我只能告诉你:法向量表示的是一个方向,而顶点表示的是一个位置,是不同的东西。对于第二种理由,主要是大家差不多都忘记了线性代数。如果一个变换矩阵只包含旋转的话,它一定是个正交的矩阵,即: 而且,这时还有 的关系。结合一下可知在一个只包含旋转的变换里。法向量的变换矩阵的确就是Model View矩阵。但是如果变换中包含非正交的因素,如:平移、错切等。那情况就不一样。即使你看到了所谓的正确的结果。那也是近似正确的,至少在理论上,它就是不正确的^_^

 

Reference :

Real-Time Rendering

 

心蓝---潘李亮:2003-12-7完成

Stanly Lee.2003-12-7

Email:xheartblue@etang.com

主页:http://gamehunter.3322.net/xpertsoft/

QQ:81496744   欢迎交流

法线变换详解 和 3D 变换中法向量变换矩阵的推导

3D 变换中法向量变换矩阵的推导潘李亮 2003-11-23 xheartblue@etang.com 在一个 3D 几何管道中,输入的顶点要经过一系列的变换,最终变换到一个投影空间里来,去掉最后的...
  • u012419410
  • u012419410
  • 2014年12月26日 18:14
  • 1999

DirectX学习笔记(十三):取景变换矩阵计算及3D世界摄像机的原理分析和实现

11
  • lishuzhai
  • lishuzhai
  • 2016年09月24日 14:07
  • 2747

顶点法向量的矩阵变换

本文参考 Introduction to 3D Game Programming with DirectX 11在计算机图形学中法向量的变化跟一般顶点的变化有一定的区别,假设我们有一个切向量u=v1−...
  • dengyibing
  • dengyibing
  • 2016年07月16日 04:06
  • 819

矩阵变换:矩阵是怎样变换向量的

可以将矩阵对向量的转换理解为对向量所在坐标系的转换。 1.向量的每个坐标都表明了平行于相应轴的偏移量,所以向量可以改写成如下形式: v = [x y z]    = [x 0 0] + [0 y...
  • zsq306650083
  • zsq306650083
  • 2013年04月08日 16:36
  • 7028

图形学1-三维坐标系间的变换矩阵推导

概要:三维坐标系的变换,实质上则是原点以及正交基向量的变化,在空间中表现为平移和旋转。 如图所示的坐标系变换,可以用一个变换矩阵来表示。 虽然原理也比较简单,但是大一学的线性代数已经有点忘记了。...
  • jc_laoshu
  • jc_laoshu
  • 2017年04月07日 20:56
  • 2492

透视矩阵的推导(最直观、最深入、最还原,看完请点赞。)

由参数l,r,b,t,n,f定义的透视投影矩阵的推导困惑了我差不多一个多礼拜,这几天几乎是天天都在思考这个问题,昨天晚上3点多钟我突然醒了,然后我又开始想这个问题,结果终于让我给想通了,于是我赶紧起床...
  • hunter_wwq
  • hunter_wwq
  • 2015年07月23日 17:29
  • 2997

OpenGL取景变换(视图变换)矩阵推导

OpenGL取景变换(视图变换)矩阵推导标签(空格分隔): OpenGL VR 游戏开发前言关于取景变换(视图变换)矩阵的推导本人查过许多资料, 包过关于openGL的和数学方面, 数学方面的资料很严...
  • yanquan345
  • yanquan345
  • 2017年02月13日 15:11
  • 557

3D 坐标变换 公式 推导

下面使用行向量: e1=(1,0,0) e2=(0,1,0) e3=(0,0,1) i, j, k是三个线性无关的向量,它们在e1,e2,e3坐标系下的坐标也记作i,j,k i’, j’, ...
  • u010476094
  • u010476094
  • 2016年01月23日 10:13
  • 1229

3D坐标系、矩阵变换、视景体与裁剪

背景 当前3D图形界主要有两个:微软的Direct 3D以及某组织的OpenGL。曾经一度OpenGL几乎占据所有3D图形领域,这在巨人微软面前简直就是屌丝逆袭。曾几何时微软搞IDE borland公...
  • czh3642210
  • czh3642210
  • 2016年06月16日 11:54
  • 1449

“生动”讲解——矩阵的空间变换

通过GIF图片“生动”的介绍矩阵的空间变换
  • a396901990
  • a396901990
  • 2015年04月14日 17:29
  • 5076
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3D变换中法向量变换矩阵的推导
举报原因:
原因补充:

(最多只允许输入30个字)