Matrix 检测4x4变换矩阵是否不仅仅在Cocoa中进行缩放和转换
给定4x4 3d变换矩阵,计算其是否比缩放和平移更有效的最佳方法是什么?具体来说,我想知道它是否旋转或扭曲图像 我正在使用Cocoa,因此可以使用CoreGraphics和CoreAnimation等库。看看您是否缺乏相关知识 如果您的变换只是:Matrix 检测4x4变换矩阵是否不仅仅在Cocoa中进行缩放和转换,matrix,graphics,3d,core-animation,Matrix,Graphics,3d,Core Animation,给定4x4 3d变换矩阵,计算其是否比缩放和平移更有效的最佳方法是什么?具体来说,我想知道它是否旋转或扭曲图像 我正在使用Cocoa,因此可以使用CoreGraphics和CoreAnimation等库。看看您是否缺乏相关知识 如果您的变换只是: 旋转 然后轴彼此保持垂直,它们的大小保持不变(通常为单位向量),但它们会旋转 缩放 仅更改轴方向向量的大小,以便轴必须保持相互垂直且不更改方向 翻译 这只是移动原点向量,其余的保持原样 倾斜 这会破坏正交性,因此轴不会相互垂直 如果你把这些放在
X,Y,Z
P=(0,0,0,1)
。。。底行X/=|X|;
Y/=|Y|;
Z/=|Z|;
if ( fabs(fabs(dot(X,(1,0,0)))-1.0)
+fabs(fabs(dot(Y,(0,1,0)))-1.0)
+fabs(fabs(dot(Z,(0,0,1)))-1.0)
+fabs(P.x-0.0)
+fabs(P.y-0.0)
+fabs(P.z-0.0)
+fabs(P.w-1.0) > 1e-6) return "not just scaling&translation";
其中:
|X|=sqrt(X.x*X.x+X.y*X.y+X.z*X.z);
dot(X,Y)=(X.x*Y.x)+(X.y*Y.y)+(X.z*Y.z);
[notes]
注意你的矩阵形式我使用OpenGL风格的矩阵(列式),如果你有行式矩阵,那么你需要转置…看看你是否缺乏相关知识
如果您的变换只是:
X,Y,Z
P=(0,0,0,1)
。。。底行X/=|X|;
Y/=|Y|;
Z/=|Z|;
if ( fabs(fabs(dot(X,(1,0,0)))-1.0)
+fabs(fabs(dot(Y,(0,1,0)))-1.0)
+fabs(fabs(dot(Z,(0,0,1)))-1.0)
+fabs(P.x-0.0)
+fabs(P.y-0.0)
+fabs(P.z-0.0)
+fabs(P.w-1.0) > 1e-6) return "not just scaling&translation";
其中:
|X|=sqrt(X.x*X.x+X.y*X.y+X.z*X.z);
dot(X,Y)=(X.x*Y.x)+(X.y*Y.y)+(X.z*Y.z);
[notes]
注意你的矩阵形式我使用OpenGL风格的矩阵(列式),如果你有行式矩阵,那么你需要转置…看看你是否缺乏相关知识
如果您的变换只是:
X,Y,Z
P=(0,0,0,1)
。。。底行X/=|X|;
Y/=|Y|;
Z/=|Z|;
if ( fabs(fabs(dot(X,(1,0,0)))-1.0)
+fabs(fabs(dot(Y,(0,1,0)))-1.0)
+fabs(fabs(dot(Z,(0,0,1)))-1.0)
+fabs(P.x-0.0)
+fabs(P.y-0.0)
+fabs(P.z-0.0)
+fabs(P.w-1.0) > 1e-6) return "not just scaling&translation";
其中:
|X|=sqrt(X.x*X.x+X.y*X.y+X.z*X.z);
dot(X,Y)=(X.x*Y.x)+(X.y*Y.y)+(X.z*Y.z);
[notes]
注意你的矩阵形式我使用OpenGL风格的矩阵(列式),如果你有行式矩阵,那么你需要转置…看看你是否缺乏相关知识
如果您的变换只是:
X,Y,Z
P=(0,0,0,1)
。。。底行X/=|X|;
Y/=|Y|;
Z/=|Z|;
if ( fabs(fabs(dot(X,(1,0,0)))-1.0)
+fabs(fabs(dot(Y,(0,1,0)))-1.0)
+fabs(fabs(dot(Z,(0,0,1)))-1.0)
+fabs(P.x-0.0)
+fabs(P.y-0.0)
+fabs(P.z-0.0)
+fabs(P.w-1.0) > 1e-6) return "not just scaling&translation";
其中:
|X|=sqrt(X.x*X.x+X.y*X.y+X.z*X.z);
dot(X,Y)=(X.x*Y.x)+(X.y*Y.y)+(X.z*Y.z);
[notes]
注意你的矩阵形式我使用OpenGL样式的矩阵(列式),如果你有行式矩阵,那么你需要转置…查看带有如下编号元素的矩阵:
[ a00 a01 a02 a03 ]
[ a10 a11 a12 a13 ]
[ a20 a21 a22 a23 ]
[ a30 a31 a32 a33 ]
- 缩放变换在元素
、a00
和/或a11
中的值不是1.0a22
- 翻译矩阵在元素
、a03
和/或a13
中的值不是0.0a23