質問されてから2年後に質問に答えるのはばかげているようですが、後世のために投稿します。
これは、変換行列と行列とベクトルの乗算に関係しています。基本的に、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]
その製品[100500 1]は、3D座標系に変換すると、最初に使用したものになります:(100,50,0)。その結果、変換が適用されていないように見えます。scaleZ()を使用した変換が効果を発揮するには、行列とベクトルの積の3番目の数値がゼロより大きくなければなりません。これは通常、scaleZ()またはscale3d()が親要素に適用されるか、別の変換関数と組み合わせて使用される場合に発生します。どちらの場合も、累積/現在の変換行列は、値がゼロより大きいZ座標になります。を使用した例を次に示しtransform: rotateY(30deg) scaleZ(3)
ます。まず、の行列にの行列を掛ける必要がありrotateY(30deg)
ます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.65049.9 1]は、整数に四捨五入すると(87、50、50)の座標になります。そしてその2番目の50は私たちのZ座標です。変換には顕著な効果があります。