Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8670

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

$
0
0

この記事は 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勉強会も運営しているので、よかったら遊びに来てね!


Viewing all articles
Browse latest Browse all 8670

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>