在提出问题两年后回答问题似乎很愚蠢,但将其发布给后代。
它与变换矩阵和矩阵向量乘法有关。基本上,除非数学计算得出 Z 坐标大于零的乘积,否则变换似乎不起作用。
这很容易解释,但如果您没有数学背景,则有点难以理解。(但一个周末的 WikiPedia 阅读和 Google 搜索足以教给你足够的知识。我就是这样学会的。) 除了 matrix() 和 matrix3d() 之外,每个变换函数都有一个等效的矩阵值。对于 scale3d,矩阵为:
[sx 0 0 0]
[0 sy 0 0]
[0 0 sz 0]
[0 0 0 1]
其中 sx、sy 和 sz 是围绕 x、y 和 z 轴缩放的因子。对于 scaleZ,它是相同的,但 sx 和 sy 都是 1。
当您应用变换时,浏览器获取对象每个顶点的坐标(用非书呆子的话说:获取每个框角的坐标)并将其乘以变换矩阵。其乘积成为对象的新坐标。例如,transform: scaleZ(3)
从 (100,50,0) 开始的对象的数学看起来有点像这样:
[1 0 0 0] [100] [100]
[0 1 0 0] * [ 50] = [ 50]
[0 0 3 0] [ 0] [ 0]
[0 0 0 1] [ 1] [ 1]
该乘积 [100 50 0 1] 在转换为 3D 坐标系时变成了我们开始的结果:(100,50,0)。结果是看起来好像没有应用转换。为了使使用 scaleZ() 的变换产生效果,矩阵和向量乘积中的第三个数字必须大于零。它通常发生在 scaleZ() 或 scale3d() 应用于父元素或与另一个变换函数结合使用时。在这两种情况下,累积/当前变换矩阵都会导致 Z 坐标的值大于零。这是一个使用transform: rotateY(30deg) scaleZ(3)
. 首先,我们需要将矩阵 for 乘以rotateY(30deg)
矩阵 for scaleZ(3)
。
[0.866 0 -0.499 0] [1 0 0 0] [0.866 0 -1.497 0]
[0 1 0 0] * [0 1 0 0] = [0 1 0 0]
[0.499 0 0.866 0] [0 0 3 0] [0.499 0 2.598 0]
[0 0 0 1] [0 0 0 1] [0 0 0 0]
然后我们可以将矩阵乘积(等号右侧的那个位)乘以我们在 (100,50,0) 处的点。
[0.866 0 -1.497 0] [100] [86.6]
[0 1 0 0] * [ 50] = [50 ]
[0.499 0 2.598 0] [ 0] [49.9]
[0 0 0 1] [ 1] [ 1 ]
如果我们四舍五入到整数,我们的产品 [86.6 50 49.9 1] 的坐标为 (87, 50, 50)。第二个 50 是我们的 Z 坐标。变换有明显的效果。