矩阵的乘法运算与css的3d变换(transform)

这篇具有很好参考价值的文章主要介绍了矩阵的乘法运算与css的3d变换(transform)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

theme: qklhk-chocolate
  1. 引言:你有没好奇过,在一个使用了transform变换的元素上使用window.getComputedStyle(htmlElement)['transform'] 查询出来的值代表什么?
  1. 为什么硬件加速要使用transform,以及为什么硬件加速会快?

小科普:关于矩阵的乘法

	以两个二阶齐次矩阵相乘为例
	[                 [                      [
	 a11,a12,     *     b11,b12,       =      a11*b11 + a12* b21 , a11*b12 + a12*b22,
	 a21,a22            b21,b22               a21*b11 + a22* b21 , a21*b12 + a22*b22
	]                  ]                      ]

由此,可以看到两个矩阵相乘就是拿第一个的每一行,乘以第二个的每一列,因此两个矩阵相乘也有个规定就是第一个矩阵的列数(每一行元素的个数),要与第二个矩阵的行数(每一列元素的个数)相等才可以发生乘法运算。

首先回答第一个问题: 由window.getComputedStyle(htmlElement)['transform']查询出来的值代表一个matrix3d函数的参数,形如matrix3d(a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3, a4, b4, c4, d4)

其中a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3,代表了线性变换,a4 b4 c4 d4代表的是位移变换。若空间中点的表示是一个列向量表示,那么,他的矩阵形式应该是这样的:

  a1 a2 a3 a4
  b1 b2 b3 b4
  c1 c2 c3 c4
  d1 d2 d3 d4

在下边的例子中我们都假定空间中的点是以列向量形式表示的。使用右手坐标系。

(实际这里也可以写成该矩阵的转置形式,在下边进行乘法运算时都分别转置下,然后交换两个矩阵的位置也是可以的,结果是一样的)

3d变换的初始矩阵如下:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

这是一个单位矩阵,这样的矩阵满足矩阵乘法运算的交换律,且和整数中1的作用一样,乘以任何数还是任何数,因此单位矩阵与其他矩阵的乘法运算不产生任何效果。

translate

translate代表一个位移变换,3d的translate变换矩阵对应的是一个如下的4阶齐次矩阵 T :

 1 0 0 dx
 0 1 0 dy
 0 0 1 dz
 0 0 0 1

假设空间内某个点D的坐标形如:

 x
 y
 z
 1

给他施加一个translate矩阵之后就可以得到的结果为 T*D :

 1*x + 0*y + 0 * z + dx,               x + dx
 0*x + 1*y + 0 * z + dy,         =     y + dy
 0*x + 0*y + 1 * z + dz,               z + dz
 0 +   0   +  0    + 1,                   1

以上的变换写成matrix3d函数的形式就是:
matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, dx, dy, dz, 1)
等价于:
translate3d(x,y,z)

变换矩阵的前三行可以分别看做一个空间坐标系上对某个点要施以某种变换的x,y,z轴上的表示,每一行的前三列代表x,y,z轴上具体要有的变换,比如在位移变换矩阵中第一行代表x轴上该点要做的变换,那么对应的y,z的值为0。(这是我个人的一点思考。可跳过。。。)

scale

scale表示的是一个缩放变换,缩放的具体数值体现在主对角线上,比如一个1.5倍的缩放矩阵S:

1.5   0   0   0
 0   1.5  0   0
 0    0  1.5  0
 0    0   0   1

给上边的点D施加一个缩放矩阵得到的结果是 S*D:

	1.5*x + 0*y   + 0*z  + 0 * 1      1.5x
    0*x  + 1.5*y + 0*z  + 0 * 1   =  1.5y
    0*x +  0*y +  1.5*z + 0 * 1      1.5z
    0*x +  0*y +   0*z  + 1 * 1       1

等价于:
matrix3d(1.5, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 1)
可简写为:
scale3d(1.5, 1.5, 1.5)

rotate

rotate 代表旋转

二维平面的rotate

二维平面的rotate代表某个点绕着某个点旋转,一个二维变换可以使用一个三阶齐次矩阵表示,其矩阵的推导可以这么推导:

  1. 首先是主对角线上的缩放数值,和第三列的位移值,都为默认值1(代表原始大小)和0(代表原始位置):
1 0 0
0 1 0
0 0 1
  1. 我们拿如下二维坐标系举例:
    矩阵的乘法运算与css的3d变换(transform)

将两个单位向量分别在x y轴上旋转θ角度,得到的A'便是x轴上旋转矩阵的值,得到的B' 便是y轴上旋转矩阵的值,因此2d的旋转矩阵是这样的(图片上的坐标系是以行向量表示的,为了统一 我们进行一次转置):

cos0   -sin0
sin0   cos0

3d空间的rotate

在一个3d空间中,旋转不再是绕某个点的旋转,而是绕某个轴的旋转(x,y,z轴),以绕x轴的旋转举例(这个图有点出入,实际BB'应该与y轴是平行的,AA'与Z轴平行,理解就好,没办法绘画功底实在太差 - -,绕某个轴旋转就是想象该条轴不动然后另一条与他垂直的轴绕着其旋转):
矩阵的乘法运算与css的3d变换(transform)

因此绕x轴的旋转矩阵可以写成这样:

1    0    0     0
0  cos0  -sin0  0
0  sin0   cos0  0
0    0     0    1

我们可以写一个rotateX(60deg),那么对应的matrix3d的参数就是:
matrix3d(1, 0, 0, 0, 0, 0.5, 0.866025, 0, 0, -0.866025, 0.5, 0, 0, 0, 0, 1)
同理可得出绕z轴和y轴的旋转矩阵:

Z:
cos0 -sin0 0 0
sin0 cos0  0 0
 0    0    1 0
 0    0    0 1
 
 Y:
 cos0   0   sin0   0
  0     1     0    0
 -sin0  0   cos0   0
  0     0     0    1

至此,css中的3d变换大体上讲完了,然后将以上几种矩阵经过不同组合相乘就能得到复合变换,值得注意的是 矩阵乘法一般不满足交换律,所以运算顺序还是比较重要的。

那为什么图形变换在计算机中一般使用矩阵表示呢?据我现在看到的资料来看,就是方便,使用矩阵运算之后,可以将多种变换统一成矩阵的乘法运算,方便计算机流水线式处理。
最后回答一下第二个问题:

2.为什么硬件加速要使用transform,以及为什么硬件加速会快?
第一点是因为css的3d transform属性使用在一个元素上该元素会被提升成一个单独的layer,在一个单独的layer上使用一些变换可以直接跳过浏览器渲染的一般流程layout,paint,直接在计算结束之后进行一次composite ,这是快的第一点, 第二点是因为使用transform变换的元素其运算发生在gpu上,而gpu的多核在处理并发运算的时候本身就要比cpu快 基本是这样。

最后分享一个矩阵的乘法运算,可以验证一下css transform相关的矩阵运算

 // 矩阵相乘
 function multipy(a,b){
        let r = a.length;
        let col = a[0].length;
        let result = [];
        for( let i = 0; i < r; i++ ){

            let row = a[i];
            result[i] = [];

            for( let j = 0; j < r; j++){
                let count = 0;
                for( let x = 0;x < col; x++ ){
                    let item1 = row[x];
                    let item2 = b[x][j]
                    count += (item1*item2)
                }
                result[i].push(count)


            }
        }
        return result;

    }
    const deg45 = Math.PI/4;

后记
image-preview是一款移动端图片浏览器插件,在这个分支得提交中 将变换矩阵直接应用到了实际应用中,基本得图形变换已经全部由变换矩阵实现。文章来源地址https://www.toymoban.com/news/detail-710399.html

到了这里,关于矩阵的乘法运算与css的3d变换(transform)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在simulink中进行矩阵的乘法运算

    双击 product 选择为 Matirx 要使用 Reshape 将矩阵排列成矩阵模式 Matlab 的是按列读取向量,按列放置向量 1*4 向量或者 4*1 向量,MATLAB 都只认为是 4 维向量,而不是分别的行向量或者列向量 使用矩阵乘法,必须 reshape 重塑矩阵维度

    2024年02月11日
    浏览(43)
  • MATLAB数值计算——矩阵运算乘法、除法、乘方

    矩阵是线性代数的基本单元 矩阵含有M行N列数值 矩阵中的元素可以是实数或复数 矩阵相关的基本运算:加、减、内积、逆矩阵、转置、线性方程式、特征值、特征向量、矩阵分解 运算符: 注:矩阵的乘法运算中没有乘法交换律 运算符: * 注: x=B/A是方程x A=B的解。即x=A的逆

    2024年01月16日
    浏览(36)
  • 线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换

    本系列文章将从下面不同角度解析线性代数的本质,本文是本系列第二篇 向量究竟是什么? 向量的线性组合,基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵,列空间,秩与零空间 克莱姆法则 非方阵 点积与对偶性 叉积 以线性

    2024年02月02日
    浏览(52)
  • 基于因特尔OneAPI实现矩阵并行乘法运算

    OneAPI介绍 Intel oneAPI 是一个跨行业、开放、基于标准的统一的编程模型,旨在提供一个适用于各类计算架构的统一编程模型和应用程序接口。其核心思想是使开发者只需编写一次代码,便可在跨平台的异构系统上运行,支持的底层硬件架构包括 CPU、GPU、FPGA、神经网络处理器以

    2024年02月04日
    浏览(37)
  • 线性代数:矩阵运算(加减、数乘、乘法、幂、除、转置)

    目录 加减 数乘  矩阵与矩阵相乘  矩阵的幂 矩阵转置  方阵的行列式  方阵的行列式,证明:|AB| = |A| |B|        

    2024年01月22日
    浏览(50)
  • css-transform2D变换

    CSS transform 属性允许你旋转,缩放,倾斜或平移给定元素。 常用的 transform 属性有下面几个 属性 说明 translate(0, 0) 位移 rotate(0deg) 旋转 scale(1) 缩放 skew(0deg) 斜切 transform的说明文档 :https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform 下面分别说一下这几个方法 translate() 位移 translat

    2023年04月08日
    浏览(33)
  • python中@运算符和*运算符在矩阵乘法中的区别与作用

      我们在看python程序时,经常可以看到@运算符和*运算符,其中@运算符在传统python中通常是作为装饰器使用的。但是在Python 3.5之后,它又具备了矩阵乘法运算的功能。下面使用示例来对比这两个运算符对矩阵运算的影响:   导入用到numpy包:   创建一个维度为2×3×3的

    2024年02月12日
    浏览(46)
  • 克拉克变换(Clarke Transformation)逆变换矩阵的求法

    一个平面向量,用a(1,0),b( − 1 2 , 3 2 -frac{1}{2},frac{sqrt3}{2} − 2 1 ​ , 2 3 ​ ​ ),c( − 1 2 , − 3 2 -frac{1}{2},-frac{sqrt3}{2} − 2 1 ​ , − 2 3 ​ ​ )这三个单位向量线性表示,显然有无穷多种解,即某一特解加上N倍的(a+b+c)零向量 根据a,b,c向量的空间对称性可知 a ⃗ + b ⃗ + c ⃗

    2024年02月09日
    浏览(48)
  • 【DCT变换】Python矩阵运算实现DCT变换

    DCT变换(离散余弦变换) 是数字图像处理过程中广泛采用的一种操作,用于将空域的图像转换为频域表示,从而能够更有效地进行压缩、滤波和特征提取等处理。它在许多应用领域中发挥着重要的作用,尤其在图像和视频压缩中,DCT变换常被用作预处理步骤。 例如在 JPEG压缩

    2024年02月11日
    浏览(39)
  • GEE python:Landsat 5影像的缨帽变换(K-T)分析含矩阵乘法和影像向矩阵的转化

    Landsat影像的缨帽变换又称为高通滤波,是一种基于像元邻域的光谱反射率的统计处理方法。它可以用来从遥感影像中去除大气、地形和植被等因素的影响,从而提取出更纯净的地表信息。 缨帽变换的基本思想是将原始影像与相应的滤波模板进行卷积,达到减少照射面角度和

    2024年01月19日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包