このプロジェクトでは、Three.jsのWebGL技術とCSS3DRendererを組み合わせて、3D空間内にHTML要素を配置しています。これにより、従来のウェブページ(2D)と3Dグラフィックスの融合を実現しています。
CSS3DRendererを使用すると、HTML要素を3Dオブジェクトとして扱うことができます。例えば、以下のようにdiv要素を3D空間に配置することが可能です。
<!-- 3D空間に配置されるHTML要素 -->
<div class="css3d-element">
<div style="background: white; padding: 20px;">
<h2>タイトル</h2>
<p>コンテンツ</p>
</div>
</div>
このプロジェクトでは、以下のようなDOM構造が使用されています。
threeContainer: Three.jsのレンダリング結果を表示するコンテナ。canvas: WebGLレンダラーの出力先。div (transform-style: preserve-3d): CSS3Dレンダラーの出力先。css3d-element: ユーザーが追加したHTML要素。
<!-- 実際のDOM構造の例 -->
<div id="threeContainer">
<!-- WebGL用のcanvas -->
<canvas></canvas>
<!-- CSS3Dレンダラーの出力 -->
<div style="transform-style: preserve-3d;">
<!-- CSS3Dオブジェクト -->
<div style="
position: absolute;
transform: matrix3d(...);">
<!-- ユーザーが追加したHTML要素 (.css3d-element) -->
<div class="css3d-element">
<div style="background: white; padding: 20px;">
<h2>タイトル</h2>
<p>コンテンツ</p>
</div>
</div>
</div>
</div>
</div>
「インタラクション」ボタンを使用すると、HTML要素へのマウスイベントの有効・無効を切り替えることができます。これにより、3D空間内のHTML要素を操作したり、背後にある3Dオブジェクトを操作したりすることが可能になります。
THREE.jsのCSS3DRendererは、HTMLとWebGLの3D空間を組み合わせるために、以下のようなDOM構造を自動的に生成します:
<div id="threeContainer">
<!-- WebGL用のcanvas -->
<canvas></canvas>
<!-- CSS3Dレンダラーの出力(自動生成) -->
<div style="transform-style: preserve-3d;">
<!-- CSS3Dオブジェクト(自動生成) -->
<div style="position: absolute; transform: matrix3d(...);">
<!-- ユーザーが追加したHTML要素 -->
<div class="css3d-element">
<div style="background: white; padding: 20px;">
<h2>タイトル</h2>
<p>コンテンツ</p>
</div>
</div>
</div>
</div>
</div>
重要なポイント:
注意: CSS3D要素は通常のDOM要素として扱われるため、多数の要素を配置する場合はパフォーマンスに影響を与える可能性があります。必要最小限の要素数に抑えることを推奨します。
このプロジェクトは、Three.jsとCSS3DRendererを組み合わせることで、3D空間内にHTML要素を自由に配置し、操作することができることを示しています。これにより、ウェブ開発の新たな可能性が広がります。