楼主的文章写得很犀利,通俗易懂。
现在有个问题想向楼主请教。
在directx中,我想自己写投影矩阵的逆矩阵,其中x、y、z这些都
好实现,但是w这项是对以前z求倒数,不知道怎么办...
主要矩阵与向量相乘时,是向量与矩阵的列进行点积,也就是相乘。
但要怎么实现相除呢。
最后还希望楼主能否写一篇关于逆矩阵的实现的文章喃,谢谢啦!
-
Re:
Twinsen 2010-09-11 11:40发表
-
回复cengfeng:多谢对文章的关注:)透视矩阵是不可逆的,因此不能够求出它的逆矩阵.不知道为什么要求它的逆矩阵呢?
-
Re:
cengfeng 2010-09-11 14:03发表
-
回复Twinsen:
你好! 我打算实现一个LOD地形的演示程序, 并且演示摄像机(平截头体)与地形之间的剔除关系, 并以线框模式来勾勒平截头体。 我在描绘平截头体时, 通过阅读你的一系列文章后想到了在cvv空间里来建模, 然后通过逆透视矩阵把模型还原成平截头体, 当然透视矩阵的变换是没有进行透视除法的, 所以变换后还要乘上原来的Z, 也就是除以变换后的W。 通过矩阵来变换就有很多的好处,在楼主前面的文章也提到过。 这样的话就可以把模型的顶点数据类型写成DX托管, 并且更新位置时也不再去锁定顶点缓存和解锁顶点缓存。 而且在程序里能实时调节摄像机远平面。 所以如果不用DX提供求逆的函数,而自己来实现要怎么做? 话说求逆函数效率不是很高,如果能像求相机矩阵的逆矩阵那样简便,而不用函数来求那多犀利。 [e06]
-
Re:
Twinsen 2010-09-12 10:08发表
-
回复cengfeng:我觉得这个需求可以通过定义两个相机来完成.第一个相机用来作地形剔除,并且渲染出其视锥体的线框.第二个相机用来观察整个场景,包括剔除处理后的地形以及第一个线框渲染的相机.不是很简单清楚么?
-
Re:
cengfeng 2010-09-12 12:32发表
-
回复Twinsen:嗯,我就是用的2个相机来做的,观察的相机它是任意移动和旋转的,这个我是用相机矩阵的逆矩阵来处理,关键的是这个平截头体的画法我是用的是CVV的坐标的一个长方体来描述的,要通过透视矩阵的逆矩阵来变换成平截头体。楼主的意思是直接在世界坐标系中建立一个平截头体,但这样做如果要更改平截头体的参数,比如我想调节fov的大小,或者改变远裁剪面的距离那么就得锁定顶点缓存来做,很麻烦。。。
-
Re:
Twinsen 2010-09-13 10:37发表
-
回复cengfeng:透视矩阵是不可逆的,所以没办法求.
但求CVV中的点在Frustum中对应的点或者射线是可以通过映射关系通过非矩阵的方式求出,拾取(picking)就是一个很好的例子.如果非要这么实现你的需求,就求这个映射关系把,从透视投影矩阵的推导原理很容易就可以求出.
-
Re:
cengfeng 2010-09-23 22:09发表
-
回复Twinsen:楼主,
这几天看了一下有关矩阵和行列式的内容, 你对透视投影矩阵不可逆的说法有误。 首先透视矩阵的行列式为-b·n^2 ≠ 0, 根据定理有行列式不为零则此矩阵必定有逆矩阵。 并且此逆矩阵为(1,1) = 1/n ; (2,2) = 1/n ; (4,3) = 1 ; (3,4) = 1/b ; (4,4) = -a/b ; 其余元素都为0。 其实最开始我就说过我已经用DX的函数求出了透视矩阵的逆矩阵, 可能楼主没注意我说的这个内容。 我最开始就是调用DX的求逆矩阵函数来实现程序里的平截头体的。 通过用函数调用来计算效率略低了点。现在我看了矩阵的相关知识,已经明白了。
-
Re:
Twinsen 2010-09-27 10:19发表
-
回复cengfeng:好!多谢指教,我回去研究研究!
-
-
-
Re:
Twinsen 2010-10-11 18:42发表
- 回复rabbit729:很高兴让你有收获:)这两个方法正是上面的特殊情况方程和一般情况方程所描述的.大多数情况下使用前一个方法就可以了,但是如果你的投影平面不是相对于原点对称的话,比如(left, top, right, bottom)范围是(0, 0, 2, 2),而不是(-1, -1, 1, 1)这样对称的,则需要使用第二个方法.
-
Re:
Twinsen 2010-10-12 17:54发表
- 回复rabbit729: 至少在编写API无关的图形引擎的时候可以使用它,因为OpenGL只有一般情况矩阵的设置函数,所以需要在D3DXMatrixPerspectiveOffCenterLH()和glFrustum之间作切换:)