您的位置:首页 > 其它

翻译:Panda3D Manual/V. Programming with Panda/V. Math Engine

2008-04-15 18:33 711 查看
数学引擎(Math Engine
Panda3D内建了许多操作向量、矩阵和4元组的方法。相关的类有:(等着吧,有人会写)

矩阵表示(Matrix Representation
时不时有人问:Panda的矩阵是以行优先(column-major)还是列优先(row-major)格式来存储呢?不幸的是,提出问题的人通常没有意识到矩阵其实有4种表示方法,其中2种称为“行优先”,另2种称为“列优先”。因此回答这个问题的没有任何意义。本节首先介绍4种不同的矩阵表示法,然后再说明panda使用其中的哪一种。
问题
在计算机图形学里,矩阵主要用于顶点变换。因此一个矩阵可以写成4个变换方程。假设矩阵将一个输入向量(Xi,Yi,Zi,Wi)变换成输出向量(Xo,Yo,Zo,Wo),我们得到如下4个变换方程:
Xo = A*Xi + B*Yi + C*Zi + D*Wi
Yo = E*Xi + F*Yi + G*Zi + H*Wi
Zo = J*Xi + K*Yi + L*Zi + M*Wi
Wo = N*Xi + O*Yi + P*Zi + Q*Wi
在内存中存储方程的系数有2种顺序:
第一种:A,B,C,D,E,F,G,H,J,K,L,M,N,O,P,Q
第二种:A,E,J,N,B,F,K,O,C,G,L,P,D,H,M,Q
当你在使用手册里排版(或在屏幕上打印)这些系数时,也有2种方法:
A B C D
E F G H
J K L M
N O P Q

排版1
A E J N
B F K O
C G L P
D H M Q

排版2
这些都是独立的选项!系数的存储顺序和排版格式之间是没有任何关系。也就是说,可以有4种组合供系统选用。
因此非常清楚了,“行优先”和“列优先”这2个术语不足以区分这4种可能。更糟糕的是,据我所知目前还没有人对这4种可能制定术语。因此,下文将提出一种可行的术语。
系数是导数
上面的公式包含16个系数,这些系数都是导数。例如,系数“G”也可称为“Yo关于Zi的导数”。
这为我们提供了系数分组的一条捷径。系数“A、B、C、D”可称为“Xo关于Xi、Yi、Zi、Wi的导数”或者简称“Xo的导数”。系数“A、E、J、N”也可称为“Xo、Yo、Zo、Wo关于Xi的导数” 或者简称“关于Xi的导数”。
这是一个好办法,它无需提到存储顺序或排版样式就能明确地区分4种系数形式。
矩阵存储方法命名
矩阵的存储有2种方法。使用新发现的“系数是导数”概念,我给2种存储方法起了有意义的名字:
A B C D E F G H G K L M N O P Q
Xo的导数优先
A E J N B F K O C G L P D H M Q
关于Xi的导数优先
第一种存储方式把Xo的导数放在前面,第二种把关于Xi的导数放在前面。
打印矩阵方法命名
上面的4个等式可以用数学符号来表示。有2种方法,如下:
列向量:




行向量:




我们看到2个矩阵的布局是不同的。第一种布局适合于使用列向量,第二种适合使用行向量,因此启发了我使用“行向量一致”和“列向量一致”术语来命名这2种矩阵排版格式。
四种可能
现在,引擎可以使用4种矩阵表示法:
1. 以Xo的导数优先存储,以行向量一致排版(行优先)
2. 以Xo的导数优先存储,以列向量一致排版(列优先)
3. 以关于Xi的导数优先存储,以行向量一致排版(行优先)
4. 以关于Xi的导数优先存储,以列向量一致排版(列优先)
从中我们可以看到“行优先”和“列优先”无法区分矩阵表示法,它无法指出实际的存储或排版顺序。
Panda符号
既然已经创造了术语,现在就可以介绍panda使用哪一种矩阵表示法。观察panda源代码,在“LMatrix4f::xform”中你会发现那4个转换方程。我对代码进行了一些简化(比如去掉一些C++怪癖)好在下面展示出来:
define VECTOR4_MATRIX4_PRODUCT(output, input, M) /
output._0 = input._0*M._00 + input._1*M._10 + input._2*M._20 + input._3*M._30; /
output._1 = input._0*M._01 + input._1*M._11 + input._2*M._21 + input._3*M._31; /
output._2 = input._0*M._02 + input._1*M._12 + input._2*M._22 + input._3*M._32; /
output._3 = input._0*M._03 + input._1*M._13 + input._2*M._23 + input._3*M._33;
如果查看相应的矩阵头文件,你会找到矩阵类的定义:
struct {
FLOATTYPE _00, _01, _02, _03;
FLOATTYPE _10, _11, _12, _13;
FLOATTYPE _20, _21, _22, _23;
FLOATTYPE _30, _31, _32, _33;
} m;
这个类定义不仅说明4个方程系数如何存储,也给出了它们的排版布局。从中你可以看出panda以关于Xi的导数优先存储,以行向量一致排版。
与OpenGL和DirectX协同
Panda与OpenGL和DirectX代码兼容,三者都使用同一种存储格式:关于Xi的导数优先。你可以直接把一个panda矩阵传给OpenGL的“glLoadMatrixf”或DirectX的“SetTransform”。
但要记住,数据存储格式和排版格式是独立的选项。即使2个引擎代码通用(因为数据存储格式匹配),它们的使用手册也会彼此不同(因为排版格式不匹配)。
Panda排版约定与OpenGL相反。OpenGL手册使用列向量一致的符号,Panda手册则使用行向量一致。
我不太了解DirectX手册使用哪种排版约定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: