如何画3D旋转效果或者卫星围绕旋转效果,固然这个也是工做中的一个任务,我在网上翻了一下,并无找到相似的东西,因此写下来仍是费了一番功夫,所以我把它拿出来记录一下,固然替换了一部份内容。好了,话很少说,进入正题。javascript
咱们都知道,浏览器是一个平面的视觉效果,如何在一个平面上看出立体的3D效果呢,其实就是一个视觉差的问题。那咱们就从一个平面视觉效果一步一步画出立体的3D效果来。我仍是先把效果放出来吧,点击预览(终版)css
卫星的轨迹通常都是圆的或者椭圆的,咱们就先以一个圆形的轨迹为例。html
很是简单,就是画一个圆形的轨迹,而后利用弧度公式计算出每一个卫星在轨迹上的位置。好比:java
三个卫星,弧度就是 var radian =2 * Math.PI /360 *60,更多的卫星就同理计算弧度web
它们三个组成的三角形边长就是:var langWidth = Math.sin(radian) * rWidth浏览器
利用勾股定理是否是就能够计算出每一个卫星的位置了。 如今咱们把样式加上,就能够看到旋转的卫星了。平面效果; 如代码中所示,咱们在13s内,让整个div自转一周(360度),为了兼容更多的浏览器,因此写了一大坨,若是不明白能够看一下 CSS3 之动画及兼容性调优
涉及的知识点: 动画的过程拆分,三角形边长位置计算sass
.r1{ animation:rotate 13s linear infinite; -webkit-animation:rotate 13s linear infinite; -moz-animation:rotate 13s linear infinite; -o-animation:rotate 13s linear infinite; } @keyframes rotate{ 0%{ transform:rotate(0deg)skew(0deg)scale(1); -ms-transform:rotate(0deg)skew(0deg)scale(1); -moz-transform:rotate(0deg)skew(0deg)scale(1); -webkit-transform:rotate(0deg)skew(0deg)scale(1); -o-transform:rotate(0deg)skew(0deg)scale(1); } 100%{ transform:rotate(360deg)skew(0deg)scale(1); -ms-transform:rotate(360deg)skew(0deg)scale(1); -moz-transform:rotate(360deg)skew(0deg)scale(1); -webkit-transform:rotate(360deg)skew(0deg)scale(1); -o-transform:rotate(360deg)skew(0deg)scale(1); } }
如今咱们要把这个平面的圆形以一条直径为转轴,旋转76度,是否是就了一点点的立体感受了。其实它仍是一个平面,为何能看到立体的感受呢? 由于咱们都知道一个远小近大的道理:当卫星转向内圈的时候,咱们让球体逐渐变大;当卫星转向外圈的时候,咱们让球体逐渐变小,这样就会产生一个远近景深的效果,也就产生了立体的感受。app
涉及的知识点:3D 元素距视图的距离(perspective),图形的角度处理立体的旋转效果有了,可是咱们的眼睛其实没法分辨哪一个是内圈,哪一个是外圈,咱们须要在中间放一个参照物来告诉咱们的眼睛,哪一个在前,哪一个在后。这样,一个完整的卫星围绕旋转效果就出来了。动画
涉及的知识点:让转换的子元素保留3D转换(transform-style: preserve-3d;)什么意思呢,就是让两个元素能够保持相对的立体空间效果。好比,土星图片和卫星轨道平面是垂直的,须要用这个属性来保持这个的空间效果。<body> <div class="star-animate"> <div class="out_circle"> <div class="nav_circle r1"> <img class="center-img1" src={require("Images/animateList/1/star.png")}/> <div class="img_top img"> <img src={require("Images/animateList/1/star1.png")}/> </div> <div class="img_bottom img"> <img src={require("Images/animateList/1/star2.png")}/> </div> <div class="img_bottom2 img"> <img src={require("Images/animateList/1/star3.png")}/> </div> </div> </div> </div> </body>