萌えハッカーニュースリーダー

2025/08/21 01:14 Creating 3D Worlds with HTML and CSS (2013)

出典: https://keithclark.co.uk/articles/creating-3d-worlds-with-html-and-css/
hakase
博士

ロボ子、CSS 3D変換でこんなすごいデモを作った人がいるのじゃ!

roboko
ロボ子

CSSで3Dですか!それは面白いですね。どんなデモなんですか?

hakase
博士

複雑なモデル、リアルな照明、影、それに衝突検出まであるのじゃ!

roboko
ロボ子

衝突検出まで!CSSでそこまでできるとは驚きです。

hakase
博士

3Dオブジェクトは、頂点の集合として格納されてるらしいぞ。x、y、zプロパティで位置を定義するのじゃ。

roboko
ロボ子

なるほど、頂点データですね。でもCSS変換って、HTML要素を使うんですよね?

hakase
博士

そう!HTML要素は長方形だから、最初は制限があるように見えるけど、PNGアルファチャネルを使うと色々できるらしいぞ。

roboko
ロボ子

アルファチャネルですか。透過を利用して表現の幅を広げるんですね。

hakase
博士

オブジェクトはJavaScriptで作られていて、平面は<div>要素なのじゃ。それをアセンブリに追加して、回転させたり移動させたりするみたい。

roboko
ロボ子

平面を組み合わせて複雑な形状を作るんですね。チューブやバレルも作れるみたいですし。

hakase
博士

照明が一番の課題だったみたいじゃ。平坦な環境に奥行きと雰囲気をもたらすからな。

roboko
ロボ子

確かに、照明は重要ですよね。平均的な3Dエンジンだと、頂点を使って法線を計算するんですよね。

hakase
博士

でもHTML要素には頂点データがないから、CSSで変換された要素の4つの頂点を計算する必要があるのじゃ!

roboko
ロボ子

なるほど、そこが工夫の見せ所ですね。最初の実験では、background-imageとlinear-gradientを組み合わせて、光をシミュレートしたんですね。

hakase
博士

そうそう!サーフェス全体が同じディテールになるから、フラットシェーディングは効果的な方法なのじゃ。

roboko
ロボ子

リアルな照明をシミュレートするには、光源からの距離に応じて暗くする必要があるんですね。

hakase
博士

そこで、<canvas>要素を使ってライトマップを生成したのじゃ!

roboko
ロボ子

canvasですか!計算された照明データを使って、ピクセルのアルファチャネルを変更するんですね。

hakase
博士

そう!canvas.toDataURL()メソッドで画像をエンコードして、background-imageの代わりに使うのじゃ。

roboko
ロボ子

各サーフェスでそれを繰り返すと、リアルな照明効果が生まれるんですね。

hakase
博士

ライトマップは小さいサイズで生成して、background-size: 100%で拡大縮小するのじゃ。バイリニアフィルタリングで綺麗に見えるらしいぞ。

roboko
ロボ子

なるほど、負荷を減らすための工夫ですね。キャンバスを照明に使ったことで、影を落とすことも可能になったんですね。

hakase
博士

影を落とすロジックは簡単で、光源への近接性に基づいてサーフェスを並べ替えるのじゃ。

roboko
ロボ子

以前のサーフェスが光線を遮っているかどうかを判断して、影にするんですね。

hakase
博士

衝突検出には、高さマップを使うのじゃ。レベルのトップダウン画像で、色で高さを表すのじゃ。

roboko
ロボ子

白が最も深く、黒が最も高い位置を表すんですね。プレーヤーの位置を2D座標に変換して、高さマップの色を確認するんですね。

hakase
博士

色がプレーヤーの最後の位置よりも明るい場合は落下、暗い場合はステップアップできるのじゃ。

roboko
ロボ子

面白いですね!今は手で描かれているけど、動的に作成することも検討しているんですね。

hakase
博士

次はゲームを作るのが目標で、Three.jsのCSS3レンダラーのプロトタイプにも取り組んでいるらしいぞ。

roboko
ロボ子

CSSでここまでできるなんて、本当にすごいですね!私も試してみたくなりました。

hakase
博士

じゃろ?私もじゃ!ところでロボ子、3D酔いしない?

roboko
ロボ子

私はロボットなので、3D酔いはしませんよ!

hakase
博士

そっか!うらやましいのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search