我有一个4 * 4矩阵和一个3d矢量。 我需要通过矩阵翻译我的矢量。
请不要太疯狂的数学符号,因为我不明白。
接近java的一个例子就是fab!
答案 0 :(得分:10)
一旦你看到它就很容易。
(New-3d-point) = Metrix-4x4 x (Old-3d-point)
意味着......
|x_new| |a1 a2 a3 a4| |x_old|
|y_new| = |b1 b2 b3 b4| x |y_old|
|z_new| |c1 c2 c3 c4| |z_old|
| 1 | |d1 d2 d3 d4| | 1 |
意味着......
x_new = a1*x_old + a2*y_old + a3*z_old + a4
y_new = b1*x_old + b2*y_old + b3*z_old + b4
z_new = c1*x_old + c2*y_old + c3*z_old + c4
d1-d4是'1'所以你不需要使用它。
希望这有帮助。
答案 1 :(得分:3)
但你需要数学。我会尽量保持温和,但如果你不知道如何进行矩阵乘法,你需要立即查看它!
首先,您需要通过向其添加额外的1来将3D矢量转换为4矢量。计算机图形通常将其称为“w”坐标(与x,y和z坐标一起使用)。
3D矢量:(X,Y,Z) - > 4D向量:(x = X,y = Y,z = Z,w = 1)
然后,您可以将4矢量乘以4x4矩阵。这样做取决于矩阵 - 但你可以制作一个矩阵来翻译矢量:
[x,y,z,1] * [1 0 0 0] = [x+a,y+b,z+c,1]
[0 1 0 0]
[0 0 1 0]
[a b c 1]
不出所料,这种矩阵称为翻译矩阵。
以这种方式做事的好处是你也可以制作一个旋转矩阵或一个缩放矩阵,然后你可以将它们中的任意多个一起乘以一个矩阵:
v * M1 * M2 * M3 = v * (M1*M2*M3)
通过生成的矩阵乘以向量相当于按顺序乘以所有组件矩阵,正如您可能想象的那样可以为您节省大量时间和麻烦。
将4向量乘以4x4矩阵的代码可能类似于:
for(int i=0; i<4; ++i) {
double accumulator= 0.0;
for(int j=0; j<4; ++j) {
accumulator+= rowVectorIn[j]*matrix[j][i]; // matrix is stored by rows
}
rowVectorOut[i]= accumulator;
}
答案 2 :(得分:2)
如果将(通常是3d)矢量(x,y,z)视为四个矢量(x,y,z,1),可以执行此操作:w = Av
< sup> T
,其中 T
是转置操作(扭曲水平矢量垂直,反之亦然),A
是正确选择的矩阵,w
是翻译后的矩阵。
你必须知道如何进行矩阵乘法。
要按(a, b, c)
进行换位,而将A
定义为:
1 0 0 a
0 1 0 b
0 0 1 c
0 0 0 1
答案 3 :(得分:1)
我不确定您的数据究竟是什么形式,但乍一看,您可能正在处理quaternions。
在没有深入研究数学的情况下,有几种方法可以表示三维矩阵变换。有欧拉角和四元数。欧拉角绝对更简单,但四元数的优点是不易受万能锁的影响。
三维实数值的四元数用4x4矩阵表示,这就是为什么我认为这可能适用于你。当然,其他解决方案的作者可能是正确的,你所处理的可能是完全不同的东西,但无论如何都可能值得学习。
希望这会有所帮助。祝你好运!