求教变换矩阵到底如何理解?
有一本书叫《3D数学基础:图形与游戏开发》里面讲的矩阵,知道他讲的什么意思,但是仍然不知道D3D是如何运用的。
我又翻了翻专门讲图形学的,发现讲的还没这本3D数学细腻形象,就给了几个公式,然后是不起眼的几句话。
线性代数就更不用提了。
我的问题很简单:就是矩阵怎么运用的?这中间的数据是怎么传递和换算的?谁把谁给变换了?
下面是一本书里的公式,虽然看不懂,但是感觉这个公式已经很清晰了
移动矩阵:
1 0 0 0
0 1 0 0
0 0 1 0
dx dy dz 1
X轴旋转矩阵:
1 0 0 0
0 cosΘ sinΘ 0
0 -sinΘ cosΘ 0
0 0 0 1
这些都看不懂。。。不知道D3D里是怎么用这些公式的。。
到现在没有看到哪本书给个使用矩阵的例子的。大多都是给了一个变换前和变换后的结果,过程却一点不知。
我现在就知道一个点怎么变换。
比如:点H:(x, y)
然后我定义一个矩阵为:
cosΘ, sinΘ
-sinΘ, cosΘ
用这个点(x, y)左乘这个矩阵,得到的新的点,就是被变换后的点,就是旋转了Θ度(似乎是逆时针)
再比如有个3D的点H:(x, y, z)
然后定义一个矩阵:
1, 0, 0
0, cosΘ, sinΘ
0, -sinΘ, cosΘ
然后用这个点H,左乘这个矩阵,得到一个旋转后的点。
D3D最基本的就是这些坐标变换、坐标系转换了。我到现在还是搞不懂,
哪位朋友可以讲一下,或者找到一些可以让人很容易理解的教程也行。。我目前是实在没办法了。
万分感激。。
[解决办法]
D3d可以帮助你构造这些矩阵,不用你自己写,而且它提供函数作矩阵乘法,一般比你自己跑得快。同时你把构造好的矩阵传给pipeline,比如SetTransform(),之后,显卡对每个顶点都会用这个矩阵去乘。如果你用shader,那么你需要自己做乘法,但是shader也提供了矩阵乘的内建函数mul
对于那个平移矩阵,可以用D3DXMatrixTranslation()来构造,构造出来得和你上面写的理论上的是一样的。
对于那个旋转矩阵,可以用D3DXMatrixRotationX()来构造。
虽然d3d已经帮你写好了这些函数,但是如果你对3d math没有概念的话就不能灵活运用。比如矩阵乘的顺序,自己做插值,随意地变换坐标系,构造布告办。等等。
[解决办法]
把顶点和矩阵相乘,就会发现矩阵的某些项,扮演着为顶点变换(平移、旋转、缩放)提供参数的作用。(前人总结出来,填哪些那些项能得到平移矩阵/缩放矩阵/旋转矩阵)
比如平移矩阵,你自己拿一个顶点和它相乘,算一遍,就会发现它化简到最后一步时的算式,和顶点平移算式是一样的。旋转、缩放也是如此。
那么为什么还要和矩阵相乘?直接用平移算式、旋转算式、缩放算式不就行了?
不行~因为靠矩阵来计算可以减少计算量。
一个顶点要进行多次变换,比如平移后旋转再平移之后再缩放,用简单算式得算4遍,矩阵只要算一遍。
原理就是公式:(顶点×矩阵A)×矩阵B = 顶点×(矩阵A×矩阵B),即矩阵接合律的推广。(矩阵一般不遵守分配律,所以顶点变换有先后顺序,一个顶点平移再旋转,和旋转再平移,得到的位置不同)
一个3D程序中,可能很多顶点都进行同一套变换。用简单算式,n个变换对m个顶点,就得算n×m遍。把n个变换做成矩阵,用矩阵乘法接合到一起,那最后m个顶点,每个只要同矩阵做一次乘运算,就可以得到变换后的位置。计算量大大降低。
而且GPU硬件上为矩阵运算提供了硬件线路。
以上是偶薄弱的数学知识对矩阵变换的浅显理解,不敢保证都说对了。
[解决办法]
这样看来楼主知道矩阵的计算,而不清楚D3D图形管线
建议楼主看D3D图形管线方面的东西就可以了
[解决办法]
那个就是要平移的距离阿。
矩阵就是对多元一次方程组的简写。你想平移的方程位
x' = x + dx
y' = y + dy
z' = z + dz
把各个元都补齐了就是
x' = 1*x + 0*y + 0*z + dx*1
y' = 0*x + 1*y + 0*z + dy*1
z' = 0*x + 0*y + 1*z + dz*1
把系数写成矩阵形式就是那个平移矩阵了