我正在尝试在Three.JS中计算转换,说实话,我是3D数学的新手。
在Three.JS中,有3x3和4x4矩阵类,但没有4x3。
目标:我想了解如何在4x3 * 4x3矩阵上进行乘法。
我有一组输入和正确的输出。我通过使用python来获得它,因为有一个名为Noesis
的库,该库具有4x3矩阵的乘法。
问题是该库是从python二进制文件中调用的,所以我看不到源代码。
python中的代码很简单:modelSpaceMat = boneMat * frameMat
这是正确的数据集的示例:
boneMat= (
(0.0, 0.0, 1.0),
(0.0, 1.0, 0.0),
(-1.0, 0.0, 0.0),
(0.0, 32.29199981689453, -3.2665998935699463)
)
frameMat= (
(0.6425124406814575, -0.06018795818090439, 0.7639083862304688),
(-0.003379624802619219, 0.9966778755187988, 0.08136376738548279),
(-0.7662678360939026, -0.05486864596605301, 0.640174925327301),
(4.438972473144531, -1.4769394397735596, 3.863013744354248)
)
modelSpaceMat=(
(-0.7639083862304688, -0.06018795818090439, 0.6425124406814575),
(-0.08136376738548279, 0.9966778755187988, -0.003379624802619219),
(-0.640174925327301, -0.05486864596605301, -0.7662678360939026),
(-1.1457012760729413e-07, 30.441999435424805, 9.592490357590577e-08)
)
boneMat= (
(1.0, 0.0, 0.0),
(0.0, 1.0, 0.0),
(0.0, 0.0, 1.0),
(0.0, 0.007000000216066837, -3.2665998935699463)
)
frameMat= (
(1.0000004768371582, 2.3320662876358256e-06, -1.4419805665966123e-05),
(2.817355607476202e-06, 0.9999991059303284, -3.3202520626218757e-06),
(1.5038006495160516e-05, -2.133270072590676e-06, 1.0000003576278687),
(-0.0015083501348271966, 0.02300064079463482, 3.266691207885742)
)
modelSpaceMat= (
(1.0000004768371582, 2.3320662876358256e-06, -1.4419805665966123e-05),
(2.817355607476202e-06, 0.9999991059303284, -3.3202520626218757e-06),
(1.5038006495160516e-05, -2.133270072590676e-06, 1.0000003576278687),
(-0.0014612301019951701, 0.030011480674147606, 9.013115777634084e-05)
)
现在,我希望能够使用javascript做到这一点。
问题:
有图书馆吗?
公式是什么?
python模块Noesis具有以下行:
def __mul__(self, other):
if isinstance(other, (NoeMat43, list, tuple)):
return noesis.mat43Mul(self, other)
elif isinstance(other, NoeVec3):
return noesis.mat43TransformPoint(self, other)
elif isinstance(other, NoeVec4):
return noesis.mat43TransformVec4(self, other)
else:
return NoeMat43([self.mat43[0]*other, self.mat43[1]*other, self.mat43[2]*other, self.mat43[3]*other])
我找不到
noesis.mat43Mul
的源代码。更新
测试Tamas Hegedus答案:
var boneMat = new THREE.Matrix4().copy(_bone.userData.modelMatrix);
var frameMat = new THREE.Matrix4();
frameMat.set(
bone.rotationMatrix[0], bone.rotationMatrix[1], bone.rotationMatrix[2], bone.positionVector[0],
bone.rotationMatrix[3], bone.rotationMatrix[4], bone.rotationMatrix[5], bone.positionVector[1],
bone.rotationMatrix[6], bone.rotationMatrix[7], bone.rotationMatrix[8], bone.positionVector[2],
0.0, 0.0, 0.0, 1.0
);
var modelSpaceMat = new THREE.Matrix4();
modelSpaceMat.multiplyMatrices(boneMat, frameMatrix);
console.log(boneMat, frameMat, modelSpaceMat);
但是此
modelSpaceMat
的结果与python库的modelSpaceMat
有点不同。就像位置部分在python中是(-1.1457012760729413e-07, 30.441999435424805, 9.592490357590577e-08)
但在javascript中是3.863013744354248, 30.815059661865234, -7.705572128295898
。这是为什么?
供参考的是
console.log
的输出:最佳答案
从数学的角度来看,您不能将4x3矩阵相乘。
关于仿射变换时,图形库在齐次空间中使用正方形矩阵的特殊子集来描述变换:
a b c 0
d e f 0
g h i 0
x y z 1
选择最后一列为
0 0 0 1
,因此变换不是透视投影。一些图形库仅存储该转换中有趣的4x3部分,但必须像4x4格式那样进行乘法。
Threejs具有内置的
Matrix4
类,该类实现乘法。关于javascript - 在JavaScript中乘以4x3仿射变换矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40563668/