当前位置:  编程技术>移动开发
本页文章导读:
    ▪【OpenGL】法线转换详解(Normal Transform)        【OpenGL】法线变换详解(Normal Transform)在图形学中,同样的一个模型视图变换矩阵可以用来变换点、线、多边形以及其它几何体,也可以变换多边形表面的切向量。比如: posEyeSpace = ModelViewM.........
    ▪ bucket sort algorithm - From Wiki        bucket sort algorithm -- From WikiPseudocode:         function bucketSort(array, n) is buckets <- new array of n empty lists for i=0 to (length(array)-1) do insert array[i] into buckets[msbits(array[i], k)] for i=0 to .........
    ▪ 怎么通过超级终端 利用串口实现arm板子和pc互相发送文件?       如何通过超级终端 利用串口实现arm板子和pc互相发送文件???一,从pc往板子上发:板子终端:rz, 然后右键发送即可!发送到板子终端用户所在的当前目录! 二,将板子上东西发给PC:鼠.........

[1]【OpenGL】法线转换详解(Normal Transform)
    来源: 互联网  发布时间: 2014-02-18
【OpenGL】法线变换详解(Normal Transform)

在图形学中,同样的一个模型视图变换矩阵可以用来变换点、线、多边形以及其它几何体,也可以变换多边形表面的切向量。比如:

posEyeSpace = ModelViewMatrix * posModelSpace。

但是,同样的方式通常却不能够用于法线的变换(注意:在有些情况下是可以的)。


一、法线和顶点坐标的区别


顶点坐标<x,y,z>表示缺省的<x,y,z,1>,而法线向量的<x,y,z>表示缺省的<x,y,z,0>。

法线向量只能保证方向的一致性,而不能保证位置的一致性。


下面我们通过一个例子来看看问题所在。


上图是针对一个多边形以及一条边上的法线进行缩放变换:X轴上缩放为原来的0.5倍。左边是变换前的状态,中间是将同样的模型变换矩阵应用在法线上的结果,显然是错的,法线并不垂直于切线。最右边的图是正确的结果。


二、法线变换:应该用变换矩阵的逆转置矩阵


假设Model space中的某条切线向量是T,法线向量是N。那么由他们是垂直的可得到:TTN=0

假设他们变换到Eye space中后分别是T'和N'。那么他们应该仍然是相互垂直的:T’TN’=0

假设切线向量和法线的变换矩阵为M、G。则有:(MT)T(GN)=0

进一步推出:TTMTGN=0

由于TTN=0,因此我们猜想MTG=0.因此:

G=(M-1)T

即:应用于法线向量的变换矩阵是顶点变换矩阵的逆转置矩阵。


三、法线变换矩阵求解的优化


传统求解逆转置矩阵的方法固然有效,但是求逆矩阵有时候不是必须的,而且有的时候逆矩阵也不存在。逆矩阵是矩阵的伴随矩阵除以矩阵的行列式的值,但是当矩阵是奇异阵的时候,行列式的值是0,这个时候逆矩阵就不存在。

即便是求解一个4*4矩阵的伴随矩阵也是复杂的,而且有时候也不是必须的。由于平移操作不影响法线向量。而且大多数模型变换都是仿射变换。

关于仿射变换(AffineTransform):

AffineTransform类描述了一种二维仿射变换流程图射变换的功能,它是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注: straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:par  常用的仿射变换:旋转、倾斜、平移、缩放allelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,而直线上点的位置顺序不变,另特别注意向量间夹角可能会发生变化。仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和错切(Shear)。

因此,他们不会改变齐次坐标的w分量。例如,没有投影变换的时候。因此,这个时候只需要计算矩阵左上方3*3子矩阵的伴随矩阵即可。

在很多情况下,甚至是求解上述的3*3伴随矩阵都不需要。假设我们知道变换矩阵是由一系列平移、旋转、等方缩放(uniform scaling)组成的,平移不影响法线,等方缩放的只影响法线的长度。剩下需要考虑的就只有旋转变换了。而旋转矩阵有一个很重要的特定就是它的转置矩阵和逆矩阵相等。因此,这个时候逆转置矩阵就是原来的矩阵,这个时候就不需要任何计算。

最后需要注意的是,对法线向量进行归一化不总是必须的。如果只有平移和旋转矩阵,那么法线长度不会发生改变。如果也有等方缩放,那么直接用它的缩放因子进行归一化。

针对那些在变换之后,依据三角形边的叉积计算法线的情况,就不需要计算法线变换矩阵了。注意:切向量和法线不同,切线是依据原始的矩阵进行变换的。


参考资料:

OpenGL Normal Vector Transformation

http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/

http://www.arcsynthesis.org/gltut/Illumination/Tut09%20Normal%20Transformation.html



    
[2] bucket sort algorithm - From Wiki
    来源: 互联网  发布时间: 2014-02-18
bucket sort algorithm -- From Wiki

Pseudocode:

       

function bucketSort(array, n) is
    buckets  <-   new array of n empty lists
    for i=0 to (length(array)-1) do 
        insert array[i] into buckets[msbits(array[i], k)]
    for i=0 to n-1 do
        nextSort(buckets[i])
    return the concatenation of buckets[0], ..., buckets[n-1]




Worst case performance:   O(n2)

average case performance : O(n+k)


    
[3] 怎么通过超级终端 利用串口实现arm板子和pc互相发送文件?
    来源: 互联网  发布时间: 2014-02-18
如何通过超级终端 利用串口实现arm板子和pc互相发送文件???

一,从pc往板子上发:板子终端:rz, 然后右键发送即可!发送到板子终端用户所在的当前目录!

二,将板子上东西发给PC:鼠标点右键,接收文件!然后板子终端:sz  。。。。(发送内容的绝对路径)。

可以这样记忆,接收方先动作!


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
c/c++开源软件 iis7站长之家
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3