🌿
🌿 MidoriPhotoArt.
3D空間と2D空間の融合。試作調査。3D空間にHTMLを配置。CSS3Dレンダラー。CSS3DObjectでカレンダーのオブジェクトを作成。CSS3DObjectのオブジェクトのコンポーネント化。カレンダーの機能いろいろ拡張。

Calendar3D クラス仕様書

ソースコード: Calendar3D.js

概要

Calendar3D クラスは、THREE.jsを使用して3D空間にインタラクティブなカレンダーを表示するためのクラスです。CSS3DRendererを利用してHTMLベースのカレンダーを3D空間に配置し、月の切り替えやサイズ調整などの機能を提供します。

クラス構造

Calendar3Dクラスは以下のプロパティとメソッドで構成されています。このクラスは3D空間でインタラクティブなカレンダーを実現するための重要な要素を全て管理します。

主な特徴:

  • THREE.jsのCSS3DRendererを活用した3D表現
  • 直感的な月の切り替えアニメーション
  • カスタマイズ可能なスタイリング
  • 効率的なメモリ管理と高いパフォーマンス
Calendar3D // 時間管理プロパティ - currentYear: number // 現在の年 - currentMonth: number // 現在の月(0-11) // 空間配置プロパティ - position: {x,y,z} // 3D空間での位置 - scale: {x,y,z} // 拡大縮小率 // 3Dオブジェクト管理 - css3dObject: CSS3DObject - scene: THREE.Scene - camera: THREE.Camera // 状態管理 - isMoving: boolean // アニメーション状態 // 初期化・設定メソッド + constructor(scene, camera, position, scale) + init(): void // カレンダー操作メソッド + createCalendarHTML(): string + updateCalendar(year, month): void // アニメーションメソッド + moveToNextMonth(): void + moveToPreviousMonth(): void + animateTransition(): void

プロパティの詳細解説

🕒 時間管理プロパティ

  • currentYear: 現在表示している年
    例: 2024年の場合 → currentYear = 2024
  • currentMonth: 現在表示している月(0-11)
    例: 1月の場合 → currentMonth = 0

🎯 空間配置プロパティ

  • position: 3D空間での位置座標
    例: 正面に配置 → {x: 0, y: 0, z: -100}
  • scale: カレンダーの拡大縮小率
    例: 半分のサイズ → {x: 0.5, y: 0.5, z: 0.5}

🎮 制御プロパティ

  • css3dObject: THREE.jsのCSS3Dオブジェクト
    HTMLをベースとした3D表現を実現
  • isMoving: アニメーション中かどうかのフラグ
    連続クリック防止などに使用

メソッドの詳細解説

🚀 初期化メソッド

  • init():
    1. HTMLの生成 2. CSS3Dオブジェクトの作成 3. イベントリスナーの設定 4. 初期位置への配置

📅 カレンダー操作メソッド

  • createCalendarHTML():
    1. 月のグリッド構造の生成 2. 日付の配置 3. スタイルの適用
  • updateCalendar():
    1. 新しい年月の設定 2. HTMLの再生成 3. アニメーション実行

処理フロー詳細図

Calendar3Dクラスの動作フローを詳細に解説します。各処理ステップでの重要なポイントと、データの流れを視覚的に表現しています。

以下のコードを元に、処理の流れを説明していきます:


// Calendar3Dクラスの初期化処理
constructor(css3dScene, camera, position = { x: 5, y: 50, z: -100 }, 
           scale = { x: 0.5, y: 0.5, z: 0.5 }) {
    this.currentYear = null;
    this.currentMonth = null;
    this.position = position;
    this.scale = scale;
    this.css3dObject = null;
    this.scene = css3dScene;
    this.camera = camera;
    this.isMoving = false;
}

init() {
    const calendarContent = this.createCalendarHTML();
    const element = document.createElement('div');
    element.innerHTML = calendarContent;
    element.style.pointerEvents = 'auto';

    const object = new CSS3DObject(element);
    object.position.set(this.position.x, this.position.y, this.position.z);
    object.scale.set(this.scale.x, this.scale.y, this.scale.z);
    this.scene.add(object);
    // ...
}
                    
初期化処理開始 パラメータ初期化と検証 ✓ 位置・スケール HTMLテンプレート生成 ✓ グリッド構造

処理ステップの詳細解説

📌 初期化フェーズ

  1. コンストラクタでのパラメータ設定
    
    constructor(css3dScene, camera, position, scale) {
        this.currentYear = null;
        this.currentMonth = null;
        // ...
    }
                                    
    • 位置・スケールの初期値設定: THREE.jsの座標系に合わせて設定
    • 現在の年月の初期化: nullで初期化し、後でinit()で設定
    • 3D環境の参照設定: シーンとカメラのインスタンスを保持
  2. init()メソッドでのHTML生成処理
    
    init() {
        const calendarContent = this.createCalendarHTML();
        const element = document.createElement('div');
        // ...
    }
                                    
    • カレンダーグリッドの構築: createCalendarHTML()で月表示を生成
    • イベントハンドラの設定: クリックやホバーイベントを設定

🎨 表示フェーズ

  1. CSS3DObjectの生成と設定
    
    const object = new CSS3DObject(element);
    object.position.set(this.position.x, this.position.y, this.position.z);
    object.scale.set(this.scale.x, this.scale.y, this.scale.z);
                                    
    • CSS3DObjectのインスタンス化: HTMLをベースに3Dオブジェクトを生成
    • 位置・スケールの適用: コンストラクタで指定された値を反映
  2. シーンへの配置とアニメーション
    
    this.scene.add(object);
    this.css3dObject = {
        element: element,
        object: object
    };
                                    
    • 3D空間への追加: シーンにオブジェクトを追加
    • 参照の保持: 後続の操作のためにオブジェクトを保存
    • アニメーション準備: トランジション効果の設定

実装例とコード解説


// Calendar3Dクラス: 3D空間でインタラクティブなカレンダーを実現
class Calendar3D {
    /**
     * Calendar3Dクラスのコンストラクタ
     * @param {THREE.Scene} css3dScene - CSS3Dオブジェクトを配置するシーン
     * @param {THREE.Camera} camera - カメラオブジェクト
     * @param {Object} position - カレンダーの初期位置 (x, y, z座標)
     * @param {Object} scale - カレンダーの初期スケール (x, y, z方向)
     */
    constructor(css3dScene, camera, position = { x: 5, y: 50, z: -100 }, scale = { x: 0.5, y: 0.5, z: 0.5 }) {
        // 基本プロパティの初期化
        this.currentYear = new Date().getFullYear();  // 現在の年を取得
        this.currentMonth = new Date().getMonth();    // 現在の月を取得
        
        // 3D空間パラメータ
        this.position = position; // カレンダーの配置位置を設定
        this.scale = scale;      // カレンダーのサイズを設定
        
        // THREE.js関連オブジェクト
        this.css3dObject = null; // CSS3Dオブジェクトの初期化
        this.scene = css3dScene; // シーンの参照を保持
        this.camera = camera;    // カメラの参照を保持
        
        // 状態管理フラグ
        this.isMoving = false;   // アニメーション状態の管理
    }

    /**
     * カレンダーの初期化と3D空間への配置を行う
     * - HTMLの生成
     * - CSS3Dオブジェクトの作成
     * - イベントリスナーの設定
     * を一括で実行
     */
    init() {
        // カレンダーのHTML構造を生成
        const calendarHTML = this.createCalendarHTML();
        
        // 以下の処理が続きます:
        // 1. HTML要素をCSS3Dオブジェクトに変換
        // 2. 位置とスケールの設定
        // 3. シーンへの追加
        // 4. イベントリスナーの設定
        // ...
    }

    // その他の重要なメソッド:
    // - createCalendarHTML(): カレンダーのHTML構造を生成
    // - updateCalendar(year, month): カレンダー表示を更新
    // - moveToNextMonth(): 次月への移動
    // - moveToPreviousMonth(): 前月への移動
    // - animateTransition(): 月切り替えアニメーション
}
                    

使用上の注意点

  • THREE.jsとCSS3DRendererが必要です
  • position、scaleは初期化時に設定可能です
  • カレンダーのスタイリングはCSSで制御されます
  • 月の切り替えはアニメーション付きで行われます