[CSS3] Transformを用いて3D立方体を表示する、アニメーションさせる
こんにちは、@yoheiMuneです。
最近リリースされた、聖戦紀ブレイブナインというソーシャルカードゲームで、Webアプリで3Dでいい感じに動いているのを見て、自分も作ってみたいなーと思いました。
ブレイブナインのコードを読んでるとどうもCSS3のTransformを使っている模様。
今回はそれを使って、立方体(キューブ)を作ってみました。
例えば以下のように使う事が出来ます。
このTransformは、2Dの変換はもちろん、3Dの変換も行うことが出来ます。 今回は、その機能を利用しました。
CSS3 Transformについての詳細は、以下などのリファレンスをご参照ください。
http://www.w3schools.com/cssref/css3_pr_transform.asp
.cubeクラスは、立方体全体を示す要素です。
.wallクラスは、立方体を構成する各面となります。
上記で注意すべき箇所は、以下のポイントです。
これで、無事に立方体が描画されるはずです。
以下のCSS Animationで実現します。
これは、以下のように実現しました。
ただ視点の位置や、視点の位置と回転の関係など面倒なことも多い感じで。
もう少し使いやすいようにしたいなぁと思う今日この頃です。
最後までご覧頂きましてありがとうございました。
最近リリースされた、聖戦紀ブレイブナインというソーシャルカードゲームで、Webアプリで3Dでいい感じに動いているのを見て、自分も作ってみたいなーと思いました。
ブレイブナインのコードを読んでるとどうもCSS3のTransformを使っている模様。
今回はそれを使って、立方体(キューブ)を作ってみました。
CSS3のTransformとは
CSS3のTransformは、対象HTML要素に対して、移動/回転/拡大縮小を行うことが出来るCSSプロパティです。例えば以下のように使う事が出来ます。
<div class='target1'></div> <style> .target1 { transform: translateX:(100px); -webkit-transform: translateX:(100px); } </style>上記例では、target1の要素をx軸方向に100px移動しています。
このTransformは、2Dの変換はもちろん、3Dの変換も行うことが出来ます。 今回は、その機能を利用しました。
CSS3 Transformについての詳細は、以下などのリファレンスをご参照ください。
http://www.w3schools.com/cssref/css3_pr_transform.asp
今回の完成イメージ
今回は、以下のような立方体と動きを作りたいと思います。1
2
3
4
5
6
CSS3 Transformで3D表現を行う為のHTML
まずは、立方体を構成するHTMLを記述します。<div class="stage"> <div class="cube"> <div class="wall" id="front">1</div> <div class="wall" id="back">2</div> <div class="wall" id="left">3</div> <div class="wall" id="right">4</div> <div class="wall" id="top">5</div> <div class="wall" id="bottom">6</div> </div> </div>.stageクラスは、立方体を描画する領域を表現します。
.cubeクラスは、立方体全体を示す要素です。
.wallクラスは、立方体を構成する各面となります。
立方体を構成するCSS
立方体を構成するためのCSSは、以下となります。/* 3D描画領域を指定するクラス */ .stage { /* perspectiveで深さ的なものを指定できます */ -webkit-perspective: 1000; /* perspective-originで、立方体をみる視点らしきものを指定できます */ -webkit-perspective-origin: 50% 50%; width: 400px; height: 400px; position: relative; } /* 立方体を保持する要素に対するクラス */ .cube { width: 200px; height: 200px; /* transform-styleにperserve-3dを指定すると3Dに見えるようになります */ -webkit-transform-style: preserve-3d; position: absolute; left: 100px; } /* 立方体を構成する壁に対する共通的なスタイル */ .wall { width:200px; height:200px; color: white; font-size: 144px; text-align: center; line-height: 200px; font-weight: bold; /* absoluteにすることで、壁を重ねて描画します */ position: absolute; top: 50px; left: 100px; } #front { background-color: rgba(255, 0, 0, 0.7); /* 重なっている壁をtransformで回転・移動して壁の位置へ配置します */ -webkit-transform: translateZ(100px); } #back { background-color: rgba(0, 255, 0, 0.7); /* 重なっている壁をtransformで回転・移動して壁の位置へ配置します */ -webkit-transform: rotateY(180deg) translateZ(100px); } #left { background-color: rgba(0, 0, 255, 0.7); /* 重なっている壁をtransformで回転・移動して壁の位置へ配置します */ -webkit-transform: rotateY(90deg) translateZ(100px); } #right { background-color: rgba(255, 255, 0, 0.7); /* 重なっている壁をtransformで回転・移動して壁の位置へ配置します */ -webkit-transform: rotateY(-90deg) translateZ(100px); } #top { background-color: rgba(255, 0, 255, 0.7); /* 重なっている壁をtransformで回転・移動して壁の位置へ配置します */ -webkit-transform: rotateX(90deg) translateZ(100px); } #bottom { background-color: rgba(0, 255, 255, 0.7); /* 重なっている壁をtransformで回転・移動して壁の位置へ配置します */ -webkit-transform: rotateX(-90deg) translateZ(100px); }
上記で注意すべき箇所は、以下のポイントです。
- .stageクラスで、深さや視点を指定している。
- .cubeクラスで、3Dに見えるようにtransform-styleを指定している。
- #front,#backなどで、壁の位置を指定している。transformは、行列の外積計算となるので、回転→移動と移動→回転では、実行結果が異なる。
これで、無事に立方体が描画されるはずです。
立方体を回転させる
次に立方体を動かします。今回は、y軸を中心に回転するようにしました。以下のCSS Animationで実現します。
#cube { -webkit-animation: rotateY 10s linear infinite; animation: rotateY 10s linear infinite; } @keyframes rotateY { 0% {transform: rotateY(0deg)} 100% {transform: rotateY(360deg)} } @-webkit-keyframes rotateY { 0% {-webkit-transform: rotateY(0deg)} 100% {-webkit-transform: rotateY(360deg)} }#cube指定の要素のtransform:rotateYをアニメーションさせることで、自転しているような動きを実現できます。
視点を変えてみる
記事の最初に示した完成例では、視点を変更できるようにしています。これは、以下のように実現しました。
<!-- スライダーUIを作成する --> <input id="range_perspective" type="range" min="-100" max="100" step="10"> <script type="text/javascript"> window.addEventListener('load', function() { var stage = document.getElementById('stage'); // スライダーの値がかわった際に、.stageクラスのperspeciveOriginを変更します。 document.getElementById('range_perspective').onchange = function(e) { stage.style.webkitPerspectiveOrigin = '50% ' + this.value + '%'; } }, false); </script>スライダーの値が変化したところで、視点を変化させるような簡易的な実装です。
最後に
CSSで3Dを表現できると知って今回実装しましたが、なかなか楽しかったです。ただ視点の位置や、視点の位置と回転の関係など面倒なことも多い感じで。
もう少し使いやすいようにしたいなぁと思う今日この頃です。
最後までご覧頂きましてありがとうございました。