LoginSignup
195
90

More than 3 years have passed since last update.

CSSだけで球体!?錯視トリックで世界を騙せ

Last updated at Posted at 2019-12-13

この記事は CSS Advent Calendar 2019 14日目の記事です。

伝えたいこと

本来、CSSだけでは球体の表現は難しく、グラデーションでそれっぽくするほかありませんでした。
この課題、アニメーションと周辺環境による錯視のトリックで解決します。

深く考えないでね

ここで紹介するテクニックは実務に応用できません。
CSSアニメーションのジョーク記事としてお楽しみください。
タイトルもジョークです...笑

先に完成図

まずはこのサンプルをご覧ください。
お急ぎの方は、このサンプルを見ておしまいです!
Qiita上では少し動作が重いので、サンプル右上のCodePenロゴをクリックしてご覧ください。

See the Pen Only CSS: Particles Following Camera 1 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

小さな球体が大量に、グルグルと旋回しているように見えませんか?
影も落ちてるし。

このトリックを解説します。
読み進めると、何かわかった感じになります。

下準備

まずは簡単に円を描き、グラデーションでそれっぽいテクスチャを与えます。
とても妥協すれば球体に見えなくもないですが、より確実に「球体」と認識できるよう、チューニングします。

See the Pen Camera following: Step1 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

錯視のテクニック

それっぽいテクスチャだけを与えられ、ちょっと嘘っぽい、ただの円。
「3D空間にある球体」として誤認させるため、3DTransformsでアニメーションを与えます。

ただし、このコントロールには少し癖があります。
CSSの場合、ひとつの要素にはひとつのtransformしか与えることができない。
この制約をうまく回避して実装する必要があります。

2つのアプローチ

ポイントは、円のテクスチャを常に正面を向けながら移動すること。
これをコントロールするアニメーションのアプローチとして、2つ考えられます。

1つは、そもそもrotate系を使わない手法。
比較的簡単ですが、円運動など、複雑な立体機動には向きません。

もう1つは、親要素にrotateを指定し、子要素には逆方向のrotateを指定して打ち消す手法。
こちらのアプローチはコントロールが難しいですが、複雑な立体機動が可能です。

今回は、後者のアプローチで実装します。
迷ったときは難しい道を選べって親父が言ってた。

Y軸回転してみよう

まずは回転専用の要素を追加し、rotateY(縦を軸に回転)で回転させます。
円はコインのように、その場でクルクルと回っています。

See the Pen Camera following: Step2 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

当たり前ですが、この時点ではまったく球体に見えません。

Z軸移動してみよう

次に、移動専用の要素を追加し、translateZ(奥行き方向に移動)させます。
円は、大きな旋回の軌道で、手前から奥へと立体的にグルグル廻っています。

See the Pen Camera following: Step3 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

奥行きは感じますが、まだ球体には見えません。

周回軌道を打ち消すY軸回転を追加しよう

本記事のメインです。
回転打ち消し専用の要素を追加し、旋回とは逆方向にrotateYさせます。
旋回はそのままに、円が常に正面を向くようになります。

See the Pen Camera following: Step4 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

おや?
ひょっとして球体に見えなくもない?

X軸回転で傾けてみよう

ここからは、円をとりまく周辺環境も整えます。
傾き専用の要素を追加し、rotateX(横を軸に回転)で傾きをつけます。
やや斜め上から見下ろしているような視点になります。

See the Pen Camera following: Step5 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

残念、球体には見えなくなりました。

傾きを打ち消すX軸回転を追加しよう

傾き打ち消し専用の要素を追加し、傾きとは逆方向にrotateXします。
ふたたび、円が正面を向くようになります。

See the Pen Camera following: Step6 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

傾きでより強い立体感を演出できました。

グラフィックを調整しよう

ボールに影を落としたり、背景にグラデーションを敷いたりして、全体のグラフィックを整えます。
物理や光源処理、素材感、床の反射率など、リアリティに気を配ります。

See the Pen Camera following: Step7 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

これを見た10人中、7〜8人は球体に見えるのでは。

円を増やしてみよう

トドメだ。
円を3つに増やして、それぞれ旋回のアニメーションにディレイを与えます。
円同士が近すぎるとバレやすいので、ギリギリのところで追いかけているように調整します。

See the Pen Camera following: Step8 by Yusuke Nakaya (@YusukeNakaya) on CodePen.

これを見た10人中、9.5人くらいは球体に見えるのでは。

まとめ

擬似的な球体表現を紹介しました。
大切なポイントは2つ。

  • 円を常に正面に向ける(回転を打ち消す)
  • ひとつの動きに、ひとつの要素

うまく活用できれば、本来は難しいはずの球体表現という圧倒的アドバンテージを得られるでしょう。
なるほどこれは、マジックですね。

フォローミー!

楽しんでいただけたら、フォローしてくれると嬉しいです!🤩
また、Meguro.cssというCSS勉強会も運営しているので、よかったら遊びに来てね!

195
90
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
195
90