css3 transform matrix 深入理解

矩阵可以用来表示图形的变换。css3定义了matrixmatrix3d方法,用来表示2维和3维的变换。下文将分析这两个接口的使用方法,并且用下文的思路,实现了一个简单的用js控制css3变换的jquery插件css3js ,

变换矩阵和净变换矩阵

matrix(a,b,c,d,e,f)有六个参数,这六个参数对应到矩阵如下:

ab0cd0ef1

在图形学上,这种叫做齐次坐标矩阵,用齐次坐标矩阵和图形的顶点相乘,就能得到变换后的新顶点的位置。比如,图形有一个顶点(a,b),现使图形整体延x轴平移100px,平移后该顶点的位置应该是(a+100,b)。很明显,下面的矩阵运算就表示了这个过程:

10001010001 × ab1 = a+100b1

因此,知道了这个齐次坐标矩阵,就可以算出任何一点变换后的位置,所以,这个齐次坐标矩阵就是变换矩阵

如果该点再次延y轴平移100px,平移后的新位置应该是(a+100,b+100),则整个过程可表示成:

10001010001 × 10001001001 × ab1= 1000101001001 × ab1 = a+100b+1001

由此可得,图形的多次变换,可以由一个净变换矩阵表示,像上面算式中的

1000101001001

就是一个净变换矩阵,保存了两次变换的结果。净变换矩阵可由多个变换矩阵相乘得到。

2D变换

我们知道matrix(a,b,c,d,e,f)有六个参数,这六个参数对应到矩阵如下:

ab0cd0ef1

对于常用的2D变换,图形学的相关书籍已经指出了其变换矩阵,我们直接使用就好了:

  • 平移

    100010xy1

    所以translate(x,y)也可以写成`matrix(1,0,0,1,x,y)

  • 缩放

    x000y0001

    所以scale(x,y)也可以写成`matrix(x,0,0,y,0,0)

  • 旋转

    cos(x)sin(x)0sin(x)cos(x)0001

    所以rotate(x)也可以写成matrix(cos(x),-sin(x),sin(x),cos(x),0,0)

  • 变形
    1tan(x)0tan(y)10001

    所以skew(x,y)也可以写成matrix(1,tan(y),tan(x) ,1,0,0)

这部分可以看一下 css3js 源代码的Matrix3的实现。

3D变换

matrix3d(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)有16个参数,这16个参数对应到矩阵如下:

0123456789101112131415

可以看到,这16个参数是按列排列出矩阵的。3维变换矩阵相比2维变换矩阵增加了一个维度,但是原理是相似的,也是使用齐次坐标矩阵表示变换矩阵和净变换矩阵。

在图形学上,对3维变换的变换矩阵也早有定义:

  • 平移

    100001000010xyz1

    所以translate(x,y,z)也可以写成`matrix(1,0,0,0,0,1,0,0,0,0,1,0,x,y,z,1)

  • 缩放

    x0000y0000z00001

    所以scale(x,y,z)也可以写成`matrix(x,0,0,0,0,y,0,0,0,0,z,0,0,0,0,1)

  • 旋转

    3维旋转稍微复杂,因为旋转的轴有可能不是标准的x,y,z轴了,而可能是任何一个向量。一般可用欧拉角和四元数表示旋转,而欧拉旋转由于存在“万向节死锁”问题,所以最好还是用四元数来表示。

    四元数,即是一个复数:p = a i +b j +c k+d,关于四元数比较难解释,可以看中文翻译《理解四元数》。幸好,四元数变换也有变换矩阵:

    x2w+cos(θ)yxw+zsin(θ)zxwysin(θ)0xywzsin(θ)y2w+cos(θ)zyw+xsin(θ)0xzw+ysin(θ)yzwxsin(θ)z2w+cos(θ)00001

    其中 w=1cos(θ)
    使用上面的变换矩阵可以实现在坐标原点绕任意轴的旋转,所以,变换完要做一次逆变换,将图形移回原来的位置。

这部分可以看一下 css3js 源代码的Matrix4的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php给留言分配id_简单实现PHP留言板功能

本文实例为大家分享了PHP留言板功能的具体实现代码,供大家参考,具体内容如下HTML代码PHP留言本留言者: {$vo.nickname}|邮箱: {$vo.email}时间: {$vo.replytime}内容: {$vo.content}{$vo.id}楼留言重置function clearDefaultText(){var nickname docume…

所有选择器

*            $("*")          所有元素 #id            $("#lastname")       id"lastname" 的元素 .class           $(".intro")…

随机数公式生成一个负数和正数之间的数_java产生从负数到正数范围的随机数方法...

第四步 完整代码至于调用方法嘛:写个test测试下;(这个方法不好代码看起来很乱,你也可以实例化,然后另写一个test调用)复制代码注意包名需要改成代码所在的包名,我的包名是求平均数package 求平均数;import java.util.A…

sklearn、theano、TensorFlow 以及 theras 的理解

sklearn ⇒ 机器学习算法和模型;theras theanoTensorFlow1. 理解模型以及函数,参数返回值的实际意义 一定要注意模型的构造函数,接收的参数列表,以及该模型本身所要解决的问题,因为在一些实现较好的框架或者库中&#…

参数等效模型可以用于_干货分享电池单体产热特性及热模型标定分析(2)

上篇已讲解了电池单体产热特性及电池模型相关理论,相较之下等效电路模型无需对电池内部的电化学反应有着深入的分析,是通过电路来描述电池的开路电压、内阻等,以实现对电池外特性的表征。本篇将继续讨论此问题,用Matlab和Amesim模…

loadrunner学习记录一

一、什么是性能测试? 使用自动化测试工具对产品按一定的性能指标进行测试,解决性能瓶颈,给用户最好的体验。 二、性能测试的目的? 目的是验证软件系统是否能够达到用户提出的性能指标,同时发现软件系统中存在的性能瓶颈…

检测同心圆_(二)光线如何被眼睛检测到?

在第一篇文章中(链接:(一)视觉系统的全貌),我们已经了解了视觉信息被大脑处理的全过程。现在,我们把目光投向一切的起点——眼睛。实际上,人们提起“视觉”,首先想到的几…

matlab计算斜方差_计算一幅图像的信噪比

本文摘自本人的毕业设计《数字图像滤波算法研究》2019, Chang’an University, Xi’an, China.本文适用于原始图像(即不含噪声的图像)存在的情况下。使用待计算SNR图像(记为A)与原始图像(记为B)做相减运算&…

数据库DBA(3年以内需求)

1、DBA工作:日常维护,备份及恢复,系统安装,补丁应用,健康检查及优化,故障处理; 2、精通sql语句、视图存储过程、函数的编写、触发器; 3、精通data guard/RAC,能顺利配置和管理data guard; 4、精通mysql Mas…

ext get id js_【翻译】Ext JS最新技巧——2015-8-11

Seth Lemmons:使用棒极了的Awesome FontExt JS 6附带了一个新的海卫一主题,可以使用Font Awesome字体作为背景图像的图标。不过,你知道如何通过“iconCls”和“glyph”来使用哪些相同的图标(以及更多来自于广泛的Font Awesome库)吗?使用海卫…

【转载】linux进程及进程控制

Linux进程控制 程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例。利用分时技术,在Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片,让每个进程在一个时间片内运…

区分大小屏幕_VESA持续推动DisplayHDR认证计划,你的屏幕属于何种等级吗?

美国视频电子标准协会(VESA)今年可说是动作频频,年初先发布了专为OLED与其他自发光显示器所制订的DisplayHDR True Black高动态范围标准,下半年则更新DisplayHDR兼容测试规范至1.1版,并发布新的DisplayHDR 1400性能分级,至于年中所…

WdatePicker显示乱码

1.修改zh-cn.js内容: var $lang{ errAlertMsg: "不合法的日期格式或者日期超出限定范围,需要撤销吗?", aWeekStr: ["周","日","一","二","三","四","五","六"],…

cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...

老刘 1前言这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址,各种网络…

MySQL中order by中关于NULL值的排序问题

MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的。 如果我们想让NULL排在后面,让非NULL的行排在前面该怎么…

vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...

随着国产手机的发展,手机像素越来越高,里面的功能也越来越丰富,手机拍照成了不少人的日常,如果你很爱拍照,手机里有一大堆照片,那么教你用手机自带的相册功能,一键将照片制作成电影,…

bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班

思路:可以贪心,也可以最短路。 贪心写法:因为在保证合法的前提下,我们选择的区间一定要右端点尽量靠后才行,于是我们每次就选择一个合法的并且右端点最靠后的区间就好了(如果没有合法的输出-1即可&#xff…

unity 烘焙参数 设置_Unity通用渲染管线(URP)系列(九)——点光源和聚光灯

200篇教程总入口,欢迎收藏:放牛的星星:[教程汇总持续更新]Unity从入门到入坟——收藏这一篇就够了​zhuanlan.zhihu.com本文重点内容:1、支持更多类型的灯光2、包含实时的点光源和聚光灯3、为点光源和聚光灯烘焙阴影4、每个物体限…

c#日期转换周几_Java时间与日期

只有把眼前的事情做好,才能考虑其他的问题。众所周知,全世界在同一时刻看手表肯定不会看到同一个时间,因为地球是圆的,面对太阳的角度是不一样的,我们一般说时间几点几点,是指的本地时间,比如国…

Python开发之--前端 HTML基础

一:HTML介绍 HTML:超文本标记语言,标准通用标记语言下的一个应用。包括“头”部分(英语:Head)、和“主体”部分(英语:Body),其中“头”部提供关于网页的信息&…