html_Display.js ソースコード仕様書
この仕様書は、export class html_Display
の設計思想と各処理の詳細を解説するためのドキュメントです。クラスはHTMLコンテンツを3Dシーン上に描画するための機能を提供し、画像の最適化、SVG生成、Canvas描画、Three.jsによるテクスチャ更新、及びユーザーインタラクションなど多くの工程を統合しています。
1. 概要
html_Display
クラスは、指定された幅・高さのキャンバス上にHTMLコンテンツを描画し、その内容をThree.jsのテクスチャとして利用します。画像は事前にBASE64形式へ変換され、必要に応じて縮小処理が施された後、SVGテンプレートとして描画されます。また、ユーザー入力に応じたインタラクティブな機能も備えています。
2. クラス図
以下は、html_Display クラスの主要なプロパティとメソッドを示す概略図です。
┌────────────────────────────────────────────────────┐
│ html_Display │
├────────────────────────────────────────────────────┤
│ - width: Number │
│ - height: Number │
│ - fps: Number │
│ - displayOptions: Object │
│ - canvas: OffscreenCanvas / HTMLCanvasElement │
│ - context: CanvasRenderingContext2D │
│ - photos: Array │
│ - effects: Object │
│ - interactiveConfig: Array │
│ - mesh: THREE.Mesh │
│ - isRunning: Boolean │
│ - lastUpdate: Number │
│ - _lastRawSvg: String │
│ - _boundUpdate: Function │
│ - _isRegistered: Boolean │
│ - _clickHandler: Function │
│ - camera: THREE.Camera │
│ - domElement: HTMLElement │
├────────────────────────────────────────────────────┤
│ + constructor(width, height, displayOptions) │
│ + start(camera, domElement): Promise │
│ + stop(): void │
│ + update(): Promise │
│ + _updateClass(): Promise │
│ + _createMesh(): void │
│ + getMesh(): THREE.Mesh │
│ + attachInteraction(camera, domElement): void │
│ + updateInteractiveElements(): void │
│ + setMeshScale(x, y, z): void │
│ + convertImageToBase64(url, maxWidth): Promise │
│ + _generateRawSVG(): String │
│ + static InteractiveElement │
└────────────────────────────────────────────────────┘
3. 主なメソッドと機能
constructor(width, height, displayOptions)
概要:
クラス初期化時に各プロパティ(キャンバス、描画コンテキスト、画像パス、エフェクト設定、インタラクション設定など)を構築します。OffscreenCanvasが利用可能ならそちらを採用し、不可能な場合はHTMLCanvasElementを生成します。
_generateRawSVG()
概要: 現在の内部状態からSVG文字列を生成します。生成されたSVGはCanvasへの描画に利用されます。
_updateClass()
概要: 最新のSVG文字列を取得し、前回の状態と比較。変化がある場合のみ、Canvasに再描画およびThree.jsメッシュテクスチャの更新を実施します。
start(camera, domElement)
概要: モジュールの実行を開始します。画像のBASE64変換、メッシュの生成、Canvasの初期更新、そしてユーザーインタラクションの設定を行います。
詳細:
画像URLリストに対して非同期処理を実行し、BASE64形式の画像データに変換します。
変換完了後、Canvasの内容をThree.jsテクスチャ化し、メッシュとして生成。
オプションでcameraとdomElementを設定し、クリックなどのユーザーイベントを紐付けます。
stop()
概要: 実行中のプロセスを停止し、グローバルコールバックやイベントリスナーから本オブジェクトの更新関数を解除します。
update()
概要: 指定のFPSに基づいてCanvasの再描画を制御し、SVGの更新処理を実行します。
詳細: 前回更新時との差分が一定時間以内の場合は処理をスキップし、必要な場合のみ再描画を行います。
attachInteraction(camera, domElement) & updateInteractiveElements()
概要:
3D空間上のメッシュに対して、ユーザーのクリックなどの入力イベントを紐付けます。SVG内のインタラクティブ領域を抽出し、クリック判定により対応するコールバック関数を実行します。
setMeshScale(x, y, z)
概要: 3Dメッシュのスケールを動的に変更するためのメソッドです。
convertImageToBase64(url, maxWidth)
概要: 指定された画像URLから画像を非同期で読み込み、必要であれば縮小処理を行った後、BASE64形式のData URLに変換して返却します。
処理の流れ:
画像のロードを開始して、ロード完了を待ちます。
画像サイズがmaxWidthを超える場合、Canvas上で縮小処理を実施。
Canvasの描画結果をData URLに変換し、返却します。
静的クラス: InteractiveElement
概要:
SVG上に定義されたクリック可能な領域を表現するオブジェクトです。各InteractiveElementは、指定の座標・サイズ、およびクリック時のコールバックを持ちます。
機能: contains() メソッドにより、与えられた点が対象領域内に存在するかを判定します。
4. シーケンス図
以下は、startメソッド実行時の主要な処理フローを示すシーケンス図です。画像の変換、メッシュ生成、及びSVG更新の各工程が視覚的に理解できます。
ユーザー html_Display.start() convertImageToBase64() _createMesh() _updateClass()
| | | | |
|---- start() ->| | | |
| |--- Promise.all() -----> (各画像変換処理) | |
| | (BASE64変換) | | |
| |<---- 変換完了収集 -------| | |
| |-- メッシュ生成処理 --->| | |
| | |-- SVG生成・描画->| |
|<-- 3D表示完了-----------------------------------------| |
5. 詳細な処理フロー
画像の読み込みと変換:
複数の画像URLに対して、非同期処理を実行。必要に応じて縮小処理を行い、各画像をBASE64形式に変換します。
SVG生成とCanvas描画:
内部状態に基づいてSVG文字列を生成し、前回の状態との差分がある場合のみCanvasへ再描画を実施。更新された内容はThree.jsメッシュのテクスチャとして反映されます。
3Dシーンへの反映:
Canvasの描画結果をテクスチャ化し、Three.jsを利用して3Dシーン内にレンダリングされたメッシュとして表示されます。
ユーザーインタラクション:
登録されたクリックイベントにより、SVG内のインタラクティブ領域が検出され、対応するコールバック関数が実行されます。
6. まとめ
html_Display
クラスは、画像の最適化処理、動的SVG生成、Canvas描画、及びThree.jsによる3Dレンダリングを統合した高度な描画モジュールです。各メソッドは明確な責務を持ち、拡張性・保守性に配慮した設計となっています。