`

在transform实现的星系图上实现当星球转至正前方触发事件需求

    博客分类:
  • css
 
阅读更多

 

 

首先星球本身只做Y轴自转,即rotateY。只需知道星球转到正前方时的角度,即可作出响应

 

获得星球transform属性值

//星球所在div id为divTransform
var el = document.getElementById("divTransform");
var st = window.getComputedStyle(el, null);
var tr = st.getPropertyValue("-webkit-transform") ||
    st.getPropertyValue("-moz-transform") ||
    st.getPropertyValue("-ms-transform") ||
    st.getPropertyValue("-o-transform") ||
    st.getPropertyValue("transform") ||
    "FAIL";
//获得transform属性matrix值并放到数组中
var values = tr.split('(')[1].split(')')[0].split(',');

 

 

介绍transform属性值的文章

转自https://blog.csdn.net/lht748/article/details/53259128,粘贴在下面:

 

直接获取transform属性的属性值会出现matrix()二维变形或matrix3d()三维变形。matrix是矩阵的意思,其实图像的变形是把图像中每个位置的像素点乘以一个仿射矩阵,到达另外一个位置,最后把变换后的所有像素点组合起来。

matrix3d(n,n.....)的属性值是由16个值组成4乘4的仿射矩阵。

 

查阅资料得知其默认的仿射矩阵是

4*4的单位阵;对应的matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 );容易看出matrix3d的参数是通过拉伸,把矩阵变成一行(即:第2行开始每行放在第1行后面)

 

单维平移变换(像素)

仅在X轴平移,translateX(tx)对应的仿射矩阵

对应的matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, 0, 0, 1)

 

仅在Y轴平移,translateY(ty)对应的仿射矩阵

对应的matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, ty, 0, 1)

 

仅在Z轴平移,translateZ(tz)对应的仿射矩阵

对应的matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, tz, 1)

 

多维平移变换(像素):

对应的matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,tx,ty,tz,1);

 

可以看出多维平移变换的仿射矩阵是三个单维平移变换仿射矩阵的乘积,虽然矩阵的乘积不能随便换,但此处可以互换乘积顺序。

 

 

 

尺度变换和平移变换相似,同理得:

 

多维尺度变换(像素):

对应的matrix3d(cx, 0, 0, 0, 0, cy, 0, 0, 0, 0, cz, 0, 0, 0, 0, 1 );

 

单维旋转变换(弧度):

(sin(θ)和cos(θ)是三角函数,不懂的同学自行百度,θ是需要旋转的弧度)

 

仅在X轴旋转,rotateX(θ)对应的仿射矩阵

对应的matrix3d(1,0,0,0,0,cos(θ),sin(θ),0,0,-sin(θ),cos(θ),0,0,0,0,1);

 

仅在Y轴旋转,rotateY(θ)对应的仿射矩阵

对应的matrix3d(cos(θ),0,-sin(θ),0,0,1,0,0,sin(θ),0,cos(θ),0,0,0,0,1);

 

仅在Z轴旋转,rotateZ(θ)对应的仿射矩阵

对应的matrix3d(cos(θ),sin(θ),0,0,-sin(θ),cos(θ),0,0,0,0,1,0,0,0,0,1);

 

多维旋转变换(弧度):

三个轴同设置时旋转的的仿射矩阵和仅旋转单一方向有一定的关系;

三轴同时旋转时按照设置顺序的倒序进行仿射矩阵的生成,如这样的设置顺序:

rotateX(θ) rotateY(θ) rotateZ(θ)

则其仿射矩阵应该这样生成

三矩阵按顺序相乘,顺便不能变,矩阵乘法跟普通乘法不同。

不推荐rotateX(θ) rotateZ(θ) rotateY(θ)这样的顺序设置,火狐上会有问题。

 

多重3D变形

同时旋转、平移、缩放的仿射矩阵也是有规律的,通过实践得出其仿射矩阵生成规律如下:

如按照从translate、scale、rotate,坐标轴从X、Y、Z的顺序生成仿射矩阵如下:

 

同样矩阵按顺序相乘,不能更改顺序,否则就不是从translate、scale、rotate,坐标轴从X、Y、Z这样的顺序生成的仿射矩阵。

同样不推荐的设置顺序,如:rotateZ(90deg) translateX(10px)  scaleX(1) translateY(20px) translateZ(30px) rotateX(90deg) scaleY(2) scaleZ(3) rotateY(90deg)

 

理论上:如果随意设置translateX、scaleX、rotateX、translateY、scaleY、rotateY、translateZ、scaleZ、rotateZ,其仿射矩阵的生成应该是顺序设置的倒序,单维度仿射矩阵逐个相乘。并未做过实践,不保证其正确性。

至此,常用的仿射变换应该都解释完了。

 

实验:

给元素设置css属性:

 

translateX(10px) translateY(20px) translateZ(30px)  scaleX(1) scaleY(2) scaleZ(3) rotateX(90deg) rotateY(90deg) rotateZ(90deg);先平移、后缩放、再旋转

分析:

套入上述仿射矩阵得:

 

matlab计算,得出结果

浏览器中JQuery获取:matrix3d(0, 0, 3, 0, 0, -2, 0, 0, 1, 0, 0, 0, 10, 20, 30, 1),结果计算正确。

 

 

 

换一种设置顺序:先旋转、后平移、再缩放

transform: rotateX(90deg) rotateY(90deg) rotateZ(90deg) translateX(10px) translateY(20px) translateZ(30px)  scaleX(1) scaleY(2) scaleZ(3);

matlab计算:

 

浏览器中JQuery获取:matrix3d(0, 0, 1, 0, 0, -2, 0, 0, 3, 0, 0, 0, 30, -20, 10, 1),结果计算正确。

值得注意的是上述两个例子,两次属性值相同,顺序不同,得到的却是不同的仿射矩阵,因而,我们在设置transform属性值的时候要注意顺序。

 

关于transform属性获取问题

如果获取的是计算后的transform,那么它返回的是一个4*4仿射。矩阵如果是多维旋转,其返回的是运算后的仿射矩阵要获取单一属性值是困难的。三轴同时旋转,要从一个计算后的矩阵中分解出3个矩阵是困难的,一般都是知道其它2矩阵,才能得出第3个矩阵;如果是多重3D变形,其获取难度将更困难。

举个例子:给出matrix3d(0, 0, 1, 0, 0, -2, 0, 0, 3, 0, 0, 0, 30, -20, 10, 1),能确定它是包含了什么变换吗。平移?旋转?缩放?

 

如果是直接获取样式表的样式,直接元素.style.transform再对它返回的字符串进行拆分就可以获取到你在样式表上设置的值了。

var test = document.getElementById('div').style.transform

 

matrix(a,b,c,d,e,f)有位dalao做了很详细的解析,可以参考:http://www.zhangxinxu.com/wordpress/?p=2427

其中有个疑问,就是文章中解释到“x, y表示转换元素的所有坐标(变量)”,理解起来挺抽象的。

参考《数字图像处理》后发现,应该可以这样理解:

其x, y在设置偏移中心的时候是中心点的坐标;

在设置缩放、旋转、平移的时候应该是元素的像素坐标,其实就是像素点在元素中的坐标。

 

总结:我们在用transform的时候,所用的translate、scale、rotate,不过是修改仿射矩阵上的数值。如果单单用这些属性会被限制住,用仿射矩阵可以做一些translate、scale、rotate做不到的事情,比如我随便构造一个4*4的仿射矩阵,套用到元素中,会发生一些奇怪的事。还可参考:http://www.zhangxinxu.com/wordpress/?p=2427,一个简单的2D镜像对称例子,怎么构造出有用的仿射矩阵,我还有待研究。总之,先把笔记做好......。

 

循环解析transform属性值

使用setInterval方法,循环获得transform属性值,从上面的文章可以看到只有rotateY时,矩阵第一个值(也就是本文开头values数组中第一个值)是cos。另外当求转到正前方时我们设置的是0度。因此setInterval内部方法可以设置条件values[0]在0.95~1时触发事件(0.95这个值可自己根据情况设置)

分享到:
评论

相关推荐

    CSS3星系轨道3D环绕旋转代码

    例如,当鼠标悬停在星球上时,可能会有一个过渡效果,使得星球的光效增强或者颜色变化,这都是通过设置`transition`属性实现的: ```css 星球元素 { transition: opacity 0.5s ease-in-out; } ``` 在项目文件中,...

    CSS3实现星系轨道旋转特效.zip

    这个特效模拟了星系中的星球在轨道上旋转的场景,为网页增添了一种宇宙般的科幻感。接下来,我们将深入探讨CSS3中的关键技术和属性,以及它们如何协同工作来创造出这样的特效。 首先,`animation`属性是CSS3的核心...

    CSS3 transform实现图片旋转木马3D

    此外,为了实现3D旋转木马的循环展示,我们可以利用JavaScript来动态改变图片的类(class),使其在激活和非激活状态之间切换,从而触发`transform`的变化。例如: ```javascript let images = document....

    翻转图像的Transform Filter

    在DirectShow领域,Transform Filter是一种特殊类型的过滤器,它用于处理媒体流,特别是进行像素级别的图像变换。"翻转图像的Transform Filter"是这样一个自定义过滤器,它的主要任务是实现图像的翻转功能,包括水平...

    html+css实现星系图

    比如,通过CSS动画可以让星星缓慢旋转,或者当鼠标悬停在某个星球上时,该星球放大或改变颜色,带来交互性。 总的来说,"html+css实现星系图"是一个展示HTML和CSS强大能力的实例。它展示了如何用基本的HTML元素构建...

    transform实现手风琴

    在网页设计中,"手风琴"是一种常见的交互效果,常用于内容展示,尤其是当有大量但不希望一次性显示的内容时。它通过折叠和展开的方式,使得用户可以按需查看内容,提高用户体验。"transform实现手风琴"是利用CSS3的`...

    基于CSS3实现的transform属性相册图片墙源码

    【CSS3实现的transform属性相册图片墙源码详解】 在现代网页设计中,CSS3的引入极大地丰富了网页的视觉表现力,其中`transform`属性是关键的一部分。本源码利用CSS3的`transform`属性实现了照片墙的动态缩放效果,...

    Unity3D中使用uGUI实现3D旋转特效(简单,好用)

    另外,使用RectTransform的锚点(Anchors)和偏移(Offsets)可以确保旋转效果在不同分辨率的屏幕上保持一致。 总之,Unity3D的uGUI系统为我们提供了一个强大且灵活的平台来创建3D旋转特效。通过结合RectTransform...

    CSS3实现五彩3D旋转星球

    3D变换允许我们在二维平面上创建三维效果,通过`transform`属性来实现。这个属性包含多个子属性,如`rotateX()`, `rotateY()`, `rotateZ()`,分别用于绕X、Y、Z轴旋转元素。在创建3D旋转星球时,我们通常会结合使用`...

    CSS3动画(3):transform实现multi-flip图片轮播动画

    在本文中,我们将深入探讨如何使用CSS3的`transform`属性来实现一个令人惊叹的multi-flip图片轮播动画。这种动画效果可以为网站或应用增添动态视觉效果,吸引用户的注意力,提高用户体验。 首先,我们要了解`...

    css3 transform属性制作鼠标点击3D图片叠加动画效果

    在网页设计领域,CSS3(层叠样式表第三版)为开发者提供了许多强大...同时,掌握CSS3的transform属性不仅能够提升网页设计的视觉吸引力,还能提高页面性能,因为大多数变换可以在浏览器的GPU上处理,减轻了CPU的负担。

    图片编辑旋转缩放位移最终版(缩放transform实现).rar

    在IT领域,尤其是在Web开发中,图片编辑是一个常见的需求,特别是在网页设计、用户界面(UI)开发或者在线图像处理应用中。本项目“图片编辑旋转缩放位移最终版(缩放transform实现)”聚焦于使用HTML来实现这些功能,...

    一款纯CSS3代码实现星系轨道旋转网站菜单特效源码.zip

    3. **过渡(Transitions)**:`transition`属性允许元素在两种状态之间平滑过渡,比如当鼠标悬停在菜单项上时,菜单项缓慢旋转或改变颜色,提升用户体验。 4. **动画(Animations)**:CSS3的`@keyframes`规则定义...

    抽奖H5仿soul首页星球旋转,可以自定义奖品名单,可以改成自定义中奖数量,中奖弹窗和中奖记录,只能中奖一次中奖后颜色变化,重置

    首先,"星球旋转"是这个抽奖H5的核心视觉元素,它可能是通过CSS3的transform属性实现旋转动画,利用transition或animation来控制旋转的速度和方向。同时,JavaScript可能被用来控制动画的触发时机,比如用户点击抽奖...

    10种纯CSS3 transform鼠标悬停到图片上过渡动画显示

    在"10种纯CSS3 transform鼠标悬停到图片上过渡动画显示"这个主题中,我们将研究如何利用这些技术来提升用户体验,特别是在网页中的图像交互。 1. **基础概念:** `transform`属性允许开发者应用2D或3D转换到一个...

    CSS3实现星系轨道旋转特效特效代码

    在星系特效中,当鼠标悬停在星球或其他元素上时,可能会触发transition,使得颜色、大小或透明度等属性逐渐改变,增加视觉吸引力和互动性。 4. **图片使用**: 效果中的"圆球和光效是图片",这表明设计者使用了...

    shrinker,用asm和transform api实现android r类的内联常量字段.zip

    在Android应用开发过程中,优化资源的使用和代码体积是至关重要的。这里我们要探讨的开源项目——"shrinker",就是针对这个问题提供的一种解决方案。它利用ASM库和Android的transform API,实现了对R类中常量整型...

    纯js实现360度旋转预览图片特效

    在实现360度旋转时,JavaScript通常会将原始图片拆分为多个切片,每个切片对应图片的一部分,然后根据旋转角度动态显示对应的切片,从而达到连续旋转的效果。此外,为了优化用户体验,可能还会利用CSS3的`transform`...

Global site tag (gtag.js) - Google Analytics