Bezier曲面Zバッファ法(4分再帰分割法)

マウス操作:
ドラッグ: 回転
ホイール: 距離調整
6
回転X: 30°
回転Y: 45°
距離: 20

現在の曲面: 標準Bezier曲面

ワイヤーフレーム: OFF

制御点数: 4x4

Bezier曲面の4分割による再帰的分割でZバッファ法を実装

曲面の4分割によるZバッファ法を実装したHTMLとJavaScriptのコードを作成します。曲面の4分割によるZバッファ法を実装しました。このコードの主な特徴: ## 実装のポイント **1. 4分割アルゴリズム** - `SurfacePatch`クラスで曲面の4角形パッチを管理 - `subdivide()`メソッドで4分割を実行 - 1画素サイズになるまで再帰的に分割 **2. Zバッファ法** - 各ピクセルにZ値(奥行き)を記録 - バイリニア補間でパッチ内のZ値を計算 - 深度テストでより手前の面を描画 **3. 曲面の種類** - 楕円放物面 - 双曲放物面(鞍面) - 波面 **4. インタラクティブ機能** - X/Y軸回転制御 - 分割レベル調整 - ワイヤーフレーム表示 - アニメーション ## アルゴリズムの流れ 1. 曲面全体を1つの4角形パッチとして開始 2. パッチが1画素サイズでなければ4分割 3. 各サブパッチで同様の処理を再帰実行 4. 1画素サイズになったパッチをZバッファ法で描画 5. バイリニア補間でピクセル内のZ値を計算 6. 深度テストに通ったピクセルのみ描画 この実装により、複雑な曲面でも正確な隠面消去が可能になります。分割レベルを上げることで、より精密な描画ができます。

表示倍率をさらに大きくし、ワイヤーフレーム表示と自動回転の問題を修正します。問題を修正しました。主な変更点: ## 修正内容 **1. 表示倍率の増加** - 投影スケール: 160 → 240(さらに1.5倍に拡大) - より大きく、詳細に曲面が表示されます **2. ワイヤーフレーム表示の修正** - ImageData描画後に別途ワイヤーフレームを描画するように変更 - グリッド状の線で曲面の構造を表示 - 20×20のグリッドで滑らかなワイヤーフレーム表示 **3. 自動回転機能の修正** - `requestAnimationFrame`を正しく使用 - ボタンのテキストが「自動回転」↔「回転停止」で切り替わります - アニメーション状態の管理を改善 ## 動作確認 - **ワイヤーフレーム表示**: ボタンクリックで白いグリッド線が表示されます - **自動回転**: ボタンクリックでY軸周りの連続回転が開始/停止します - **表示倍率**: 曲面がより大きく画面いっぱいに表示されます **操作方法:** 1. 「ワイヤーフレーム表示」ボタンで構造線のON/OFF 2. 「自動回転」ボタンで連続回転の開始/停止 3. マウスドラッグで手動回転 4. ホイールで距離調整 これで全ての機能が正常に動作し、Bezier曲面の詳細な構造と美しい形状を確認できます。

エラーの原因は、`animate`という関数名がWeb Animations APIの`Element.animate()`メソッドと競合しているためです。関数名を変更して修正します。エラーを修正しました。問題の原因と解決策: ## エラーの原因 - `animate`という関数名がブラウザの標準API `Element.animate()`と競合 - JavaScriptエンジンが混乱してWeb Animations APIの方を呼び出そうとしてエラー発生 ## 修正内容 - 関数名を `animate()` → `startAutoRotation()` に変更 - HTMLのonclick属性も対応して修正 これで自動回転機能が正常に動作するはずです。ボタンをクリックすると: 1. **初回クリック**: 自動回転開始、ボタンテキストが「回転停止」に変更 2. **再クリック**: 自動回転停止、ボタンテキストが「自動回転」に戻る 自動回転中は: - Y軸周りに連続回転 - マウスでの手動回転は無効化 - より大きな表示倍率でBezier曲面の詳細が確認できます