在 2D 变换中使用 rotateX 和 rotateY 的奇怪动画

weird animation with rotateX and rotateY in 2D transform

我不明白为什么 2D 变换中的 rotateX 和 rotateY 动画会移动得如此奇怪 demo

谁能解释一下,谢谢

演示代码是

哈巴狗html

.ar
.ar2

css

body { background: black;}


@keyframes wing3{
  0%{transform: rotateX(50deg)}
  50%{transform: rotateX(70deg)}
  100%{transform: rotateX(50deg)}
}
@keyframes wing4{
  0%{transform: rotateY(50deg)}
  50%{transform: rotateY(70deg)}
  100%{transform: rotateY(50deg)}
}

.ar {
  width: 40px; height: 5px; background: #fff;
   animation: wing3 1.2s infinite;
}

.ar2 {
  width: 40px; height: 5px; background: #fff;
   animation: wing4 1.2s infinite;
}

这并不奇怪,但合乎逻辑。您在 X/Y 轴上旋转,因此从我们的角度来看,您看不到任何旋转,只是大小发生了变化。

这是在 Z 轴上完成的经典旋转:

.b {
  width:100px;
  height:10px;
  background:red;
  margin:50px;
  animation:change 5s infinite linear;
}
@keyframes change{
  to {
    transform:rotate(90deg);
  }
}
<div class="b">
</div>

我们的元素在中心旋转,从 090deg。现在想象一下你正在从底部看这个轮换。您只会看到宽度减小。

这是不同的帧:

.b {
  width:100px;
  height:10px;
  display:inline-block;
  background:red;
  margin:50px 10px;;
}

body {
 margin:0;
 font-size:0;
}
<div class="b">
</div>
<div class="b" style="transform:rotate(40deg)">
</div>
<div class="b" style="transform:rotate(60deg)">
</div>
<div class="b" style="transform:rotate(80deg)">
</div>
<div class="b" style="transform:rotate(90deg)">
</div>

现在让我们从底部看这个:

.b {
  width:100px;
  height:10px;
  display:inline-block;
  background:red;
  margin:50px 5px;
}
.a {
  width:100px;
  height:10px;
  display:inline-block;
  background:blue;
  margin:50px 10px;
}
body {
 margin:0;
 font-size:0;
}
<div class="b">
</div>
<div class="b" style="transform:rotate(40deg)">
</div>
<div class="b" style="transform:rotate(60deg)">
</div>
<div class="b" style="transform:rotate(80deg)">
</div>
<div class="b" style="transform:rotate(90deg)">
</div>
<br>
<div class="a">
</div>
<div class="a" style="transform:rotateY(40deg)">
</div>
<div class="a" style="transform:rotateY(60deg)">
</div>
<div class="a" style="transform:rotateY(80deg)">
</div>
<div class="a" style="transform:rotateY(90deg)">
</div>

所以蓝色部分是我们从另一个方向看Z轴旋转的感知,相当于Y轴旋转。使用比例变换也有同样的效果,因为从我们的感知来看,这个会做同样的事情:

.b {
  width:100px;
  height:10px;
  display:inline-block;
  background:red;
  margin:50px 5px;
  animation:rotate 4s infinite linear;
}
.a {
  width:100px;
  height:10px;
  display:inline-block;
  background:blue;
  margin:50px 10px;
  animation:scale 5s infinite linear;
}

@keyframes rotate{
  to {
    transform:rotateY(90deg);
  }
}
@keyframes scale{
  to {
    transform:scaleX(0);
  }
}

body {
 margin:0;
 font-size:0;
}
<div class="b">
</div>

<br>
<div class="a">
</div>

为了以不同的方式看待这一点,您可以添加一些视角,这样您就可以使旋转更接近我们在现实世界中看到的:

.b {
  width:100px;
  height:10px;
  display:inline-block;
  background:red;
  margin:50px 5px;
  animation:rotate-1 4s infinite linear;
}
.a {
  width:100px;
  height:10px;
  display:inline-block;
  background:blue;
  margin:50px 10px;
  animation:rotate-2 5s infinite linear;
}

@keyframes rotate-1{
  to {
    transform:perspective(45px) rotateY(180deg);
  }
}
@keyframes rotate-2{
  to {
    transform:perspective(45px) rotateX(180deg);
  }
}
body {
 margin:0;
 font-size:0;
}
<div class="b">
</div>

<br>
<div class="a">
</div>