用于平面到平面投影的CSS变换矩阵

时间:2016-11-07 10:42:41

标签: matrix 3d transform transformation css-transforms

我一直在玩视觉滚动效果的3D变换,我试图了解如何进行平面投影。我已经四处搜索,但如果没有明确的例子,所涉及的矩阵数学有点难以掌握。

给定一个具有多个面板的布局,我想获得变换矩阵,将每个面板移动到一个新的任意平面上,同时保持原始的未变换透视。

为了说明这个问题,这里有一个plunker,它在3个不同的div上执行Z变换,同时进行缩放和平移以实现平面投影。我让它们看起来在特定的滚动点对齐,好像没有使用缩放和X,Y平移的转换。

transform: translateZ(60px) scale(0.4) translateX(-270px) translateY(258px);

https://plnkr.co/edit/UddWeLAWTQgkcpYMRP9q

我已经通过手动scaletranslateXtranslateY的试错来实现此示例,以便在translateZ将其拉出原位后将div移回。但是我想了解计算变换矩阵的更好方法,因为我的div不是一个固定的大小,它改变了所需的值。

1 个答案:

答案 0 :(得分:1)

我最终使用this文章中的信息来帮助找到我的解决方案,其中涉及三角形数学,而不是使用完整的转换矩阵。

这里是一名展示行动解决方案的人:

https://plnkr.co/edit/W5GTbViN0O8gnkCmxV5W?p=preview

function translateLayer( obj, y, newZ )
{
    var containerWidth = jQuery('.parallax').width();
    var x = ( obj.position().left 
              + parseInt(obj.css('marginLeft'), 10)
            ) - (containerWidth/2);
    var z = 100;

    var n = z - newZ;
    var scale = 1 - (newZ / z);
    var newX = (n / z) * x;
    var newY = (n / z) * y;
    var transX = 0 - (x - newX);
    var transY = (y - newY);

    obj.css( {
      'transform-origin': '0% 0%', 
      'transform': 'translate3d('+transX+'px, '+transY+'px, '+newZ+'px) 
                    scale('+scale+')'
    } );
}

obj是要翻译的jQuery对象。

y是从您选择的中心原点到左上角的垂直距离,正值向上移动轴,负值向下移动。由于浏览器坐标系使用左上角的原点,因此需要进行一些计算才能获得此值。您可以选择原点的位置,但此解决方案假定它是水平居中的。当滚动到达您选择的原点时,图层将同步到原始布局位置。在下面的例子中,我在3块布局的正中心选择了一个原点。

newZ是对象所需的新深度值。正值使其更接近观察者,消极值。在这个函数中,我将最大z值硬编码为100,也必须使用透视在父元素的css中定义:perspective: 100px