`
omygege
  • 浏览: 1357314 次
文章分类
社区版块
存档分类
最新评论

仿射变换下的法向量

 
阅读更多

问题原址:http://topic.csdn.net/u/20080309/16/64b1e2e5-44af-4307-919c-45ead95e69c6.html?seed=1048831947&r=60114068#r_60114068

根据原题,这个是顶点着色中常见的问题。

1楼Jiana关于这个说的很明确:“法线不是一般概念的真正向量”。这句话的本意是对的,就是平面(或切平面)的法线不能简单的通过仿射变换矩阵直接得到变换后空间的法线,但并不是像从字面上理解,法线(法向量)就不是向量了。

其次链接中讨论了法向量方向的确定,经过下面论证可以发现,还是有必要进行一番工作的。长话短说,以下就交给数学了,所有的算式未加说明采用matlab符号,但等号用'='表示。

一般三维平面向量方程:

dot( (p - p0), n ) = 0

但是仿射空间延拓到四维,内积就不为0了,但也不能轻易写dot( (p - p0), n ) = 1,因为这样解出来的显然不是所需要的平面(即使n和p0都归一化),因为这增加的一维增加了自由度。另一方面,仿射空间向量减法不是一般的四维向量减法,它必须在归一化只做后前三分量相减,我们只能记: p[-]p0和n正交,其中[-]表示这种特殊的减法。

假设仿射变换为A,

A =

a11 a12 a13 a14

a21 a22 a23 a24

a31 a32 a33 a34

0 0 0 1

那么经过变换后发现和平面交点p0变为A*p0,平面上任一点p变为A*p,变换后平面的法向量设为m,显然要求有:

A*p [-] A*p0和m正交。设p0和p都是归一化的(以下向量不加说明均为归一化的),并令e4 = [0 0 0 1]',于是有:

A*p [-] A*p0= A*p- A*p0 + e4 = A*(p-p0) + e4 = Ah*(p [-] p0)

其中Ah是A的去除平移分量版本,即a14,a24和a34为0的A。

这样就有:Ah*(p [-] p0)和m正交。令A3=Ah的3x3主子式,p3、n3和m3分别是(p [-] p0)、n和m的的前三分量构成的三维分量(退化的三维向量),根据Ah的性质,可以发现这个正交和前一个正交分别等价于:

(A3 * p3)' * m = 0,p3' * n = 0

上述方程组的解包括:

m= inv(A3)'*n或m= -inv(A3)'*n

上述过程的意义是p [-] p0(即切向量)在仿射变换中应退化到3维空间讨论(与平移无关)。

需要注意,其中一个解只保证了和平面的垂直,但是没有保持法向量原有的方向。例如原先在曲面外侧的法向量在变换后应当仍保持在外侧。

法向量的方向保持只有通过以切向量内积求法向量达成。这个过程非常繁琐,而且我们本身知道的是法向量而并没有从切向量出发,因此我们在此只是构造一下,通过比较以找出这个保持方向的正负号。

所谓切向量集就是满足平面方程的p [-] p0,我们取其中两个线性无关的分别记做u和v,根据上面讨论,在三维空间中讨论,仿射变换后,他们变为A3*u和A3*v。规定平面法向量是已定的一对切向量的外积,即cross(u,v),这样变换后的法向量为cross(A3*u, A3*v)。下面对这两个外积进行展开,这个过程相对比较繁琐。

n = cross(u, v) = [u2*u3 - u3*v2, u3*v1-u1*v3, u1*v2-u2*v1]'

m = cross(A3*u, A3*v) = [(a2*u)*(a3*v) - (a3*u)*(a2*v), (a3*u)*(a1*v), (a1*u)*(a2*v)-(a2*u)*(a1*v)]'

其中a1、a2和a3分别为A3的第1、2和3行。

简便起见,我们只对m的第一个分量进行展开:

(a2*u)*(a3*v) - (a3*u)*(a2*v)

= (a21*u1 + a22*u2 + a23*u3)(a31*v1 + a32*v2 + a33*v3)
- (a21*v1 + a22*v2 + a23*v3)(a31*u1 + a32*u2 + a33*u3)

= (a22*a33 - a23*a32) * (u2*v3 - u3*v2)
+ (a23*a31 - a21*a33) * (u3*v1 - u1*v3)
+ (a21*a32 - a22*a31) * (u1*v2 - u2*v1)

再来看算式inv(A3)'*n的展开:

inv(A3)' =

1 [ M11 -M12 M13]

------- [-M21 M22 -M23]

det(A3) [ M31-M32 M33]

这样,撇开最前面的系数,inv(A3)'*n的第一个分量为:

M11*(u2*v3 - u3*v2) - M12*(u3*v1 - u1*v3) + M13(u1*v2 - u2*v1)

M11 = a22*a33 - a23*a32

-M12 =a23*a31 - a21*a33

M13 = a21*a32 - a22*a31

在预料之中,这个结果和上述的第一分量一致。

但最终inv(A3)'*n和上述的结果相差1/det(A3)系数,我们这里关心正负性,因此在inv(A3)'*n之前需要补偿det(A3)的符号。

因此最终在仿射空间中,这个方向纠正的法向量可以通过 sign(det(Ah))*inv(Ah)'*n得出。

分享到:
评论

相关推荐

    带方差补偿的多向仿射变换点云配准算法

    结合点云统计学特性和形状特征...将多向仿射变换点云配准转化为刚性配准, 并利用主方向法配准点云。仿真结果表明, 针对点云随机丢失和带噪声的点云配准情况, 所提算法比现有配准算法的配准精度更高, 并且配准耗时更短。

    仿射变换:倾斜/正交/透视/旋转等:包含多种投影和仿射变换的代码-matlab开发

    包含各种仿射变换的程序,即平移、旋转、均匀和非均匀缩放、正投影、斜投影和透视投影。 它还包含面部绘图功能,可以轻松地针对特定问题绘制 3d 图形。 这可以在代码的仿射变换... 法向量和初始状态需要由用户定义。

    论文研究-基于Fourier-Mellion变换抗仿射变换水印算法.pdf

    软间隔支持向量机(SVM,support vector machine)分类算法是目前入侵检测中最好的分类异常行为的机器学习算法之一,但是它是有监督学习方法,并不能适用于检测新的入侵行为;而1类SVM方法是一种可用于检测异常的无...

    鼻子区域检测与三维人脸姿态自动化校正

    在许多三维人脸应用中,人脸姿态校正是...再使用支持向量机分类器挑选鼻子区域,并根据模板三维人脸的姿态,对输入人脸进行三维仿射变换;最后通过迭代最近点算法获得精确的姿态校正结果.实验结果表明,该方法优于已有方法.

    采用热核特征的 SAR 图像目标识别

    为了解决 SAR 图像受相干斑噪声干扰和震后发生形变而识别率偏低的...变矩方法相比,对于仿射变换和发生形变的 SAR 图像,该方法都具有更高的识别率。因此,基于热核 特征的 SAR 图像识别方法是一种更加有效的识别方法

    《高等几何》作者: 钟集/唐素兰/叶木秀编 出版年: 2005年

    本书以克莱因的变换群观点贯穿始终,内容着重论述各种变换,包括1维射影变换,透视变换和对合,直射变换,对射变换,配极变换等,并且分别建立了射影变换群、仿射变换群、相似变换群和正交变换群。每种群对应于一种...

    matlab6.5图形图像处理源程序

    12.5.1 仿射变换( affine transformation ) 12.5.2 透视变换 (Perspective Transformation) 12.5.3 空间变换的 MATLAB 函数 12.5.4 空间变换实例 12.6 图像融合 12.7 邻域与块操作 12.7.1 邻域操作 12.7.2 ...

    MATLAB图形图像处理

    12.5.1 仿射变换( affine transformation ) 12.5.2 透视变换 (Perspective Transformation) 12.5.3 空间变换的 MATLAB 函数 12.5.4 空间变换实例 12.6 图像融合 12.7 邻域与块操作 12.7.1 邻域操作 12.7.2 ...

    matlab6.5图形图象处理源程序

    12.5.1 仿射变换( affine transformation ) 12.5.2 透视变换 (Perspective Transformation) 12.5.3 空间变换的 MATLAB 函数 12.5.4 空间变换实例 12.6 图像融合 12.7 邻域与块操作 12.7.1 邻域操作 12.7.2 ...

    VC++ matlab图像处理

    12.5.1 仿射变换( affine transformation ) 12.5.2 透视变换 (Perspective Transformation) 12.5.3 空间变换的 MATLAB 函数 12.5.4 空间变换实例 12.6 图像融合 12.7 邻域与块操作 12.7.1 邻域操作 12.7.2 ...

    图形图像处理源程序-matlab6.5图形图像处理源程序.rar

    12.5.1 仿射变换( affine transformation ) 12.5.2 透视变换 12.5.3 空间变换的 MATLAB 函数 12.5.4 空间变换实例 12.6 图像融合 12.7 邻域与块操作 12.7.1 邻域操作 12.7.2 图像块操作 12.8 区域...

    python计算机视觉编程

    3.1.2 仿射变换 3.2 图像扭曲 3.2.1 图像中的图像 3.2.2 分段仿射扭曲 3.2.3 图像配准 3.3 创建全景图 3.3.1 ransac 3.3.2 稳健的单应性矩阵估计 3.3.3 拼接图像 练习 第4章 照相机模型与增强...

    采用热核特征的SAR图像目标识别

    为了解决SAR图像受相干斑噪声干扰和震后发生形变而...实验表明:与经典的Hu不变矩方法相比,对于仿射变换和发生形变的SAR图像,该方法都具有更高的识别率。因此,基于热核特征的SAR图像识别方法是一种更加有效的识别方法。

    3D游戏.卷1.实时渲染与软件技术【有目录+可搜索+可编辑】

    —仿射变换............ ···············1 1.1.2 改变坐标系的变换…... .. .………… 6 1.2 向量与计算机图形学…………………… 7 1.2. l 向量加法···· · ··· ·· · ·· ·······...

    《计算机图形学》在线作业二.doc

    Phong明暗处理模型中,采用了双线性插值和构造法向量函数的方法模拟高光 C. Gouraud明暗模型和Phong明暗处理模型主要是为了处理由多个平面片近似表示曲面物体 的绘制问题 D. Phong明暗模型处理的物体表面光亮度呈现...

Global site tag (gtag.js) - Google Analytics