AIとThree.jsで作る3Dインタラクティブ授業:エネルギーの教科書から動くプロトタイプへ

4ラウンドのプロンプトから着手し、8種類のエネルギー貯蔵探究、見開き展開、ホットドリンク/電池の5カット実演を補完。完全な授業フローに沿って操作検証を実施。ソースコードと修正記録を収録。

著者:Techartist · Every Joule10-24 · 約 35 分

一冊の本が本棚から落ちて、最後は床の上で静止する。もともと持っていた重力による位置エネルギーはどこへ行ったのか? この問いを、生徒が予測し、操作し、説明できる教材に仕立てるのが、具体的な3Dインタラクティブ授業設計のタスクです。

Techartist が公開した3Dウェブ教材 Every Joule(すべてのジュール)第1課は、ブラウザ内の Three.js シーンを通じて、教科書の挿絵を紙面から立ち上がる「飛び出す絵本風のペーパークラフト」に仕上げています。原作者自身の説明によると、教材は Opus 5.5 と Three.js で構築されており、全10課で構成が予定され、現在一般公開されて実際に体験できるのは第1課です(教師用準備ページには14〜16歳の生徒を対象と明記)。画面には本棚から落下する本と、右側に並ぶ発光する「エネルギー缶」が配置され、位置エネルギーが減少して運動エネルギーへと流れ、衝突後は本、床、周囲の空気の熱・内部エネルギーへと分散していく過程を観察できるようになっています。

Every Joule 第1課のデスクトップ画面レイアウト
左ページには中核概念、予測問題、結果を明かすめくり紙片が配置され、右ページには3Dメカニカルモデルと8つのエネルギー缶が展開されています。
全体として白黒の紙面線画デザインを採用し、ハイライトカラーはエネルギーの貯蔵と伝達経路のために特別に残されています。

本ガイドの4ラウンドにわたるプロンプトは、空のディレクトリから Codex によって順次実行され、実際に動作する Three.js 教材が作成されています。各ラウンドのコードと実作業記録も保持されています。原作者は開発時のプロンプトや所要時間を公開していないため、以下の手順は本ガイドが独自に設計したものです。4ラウンドをそのまま進めると本の落下実験が完成し、元の授業にある8種類のエネルギー貯蔵探究を補完するには、後述の追加ラウンドが必要となります。

AIに3D教材の開発を支援させる際によくある認知の偏りは、「立体的な視覚効果」を「教育目標の達成」と同義と見なしてしまうことです。汎用的な指示だけで教材を生成させると、モデルの変位と物理的な計算ロジックが乖離したコードが生成されがちです。また、ページに明確なタスクの制約がない場合、生徒は3Dシーンを自由にドラッグして遊ぶだけのオモチャとして扱い、「高さが下がると位置エネルギーが減り、運動エネルギーが増える」という物理的なつながりを形成しにくくなります。


Techartist の教育サイクル:予測、実演、操作、解説

紙の図解を3D空間へと移植する際の中核は、モデルがどれほど精巧であるかではなく、どのようなタスクの連続によって3次元の動きを物理的な理解へと結びつけるかにあります。Every Joule 第1課は5つの教育アクションを中心に展開されています(元の授業には予測、実演、操作、解説、そして8種類のエネルギー貯蔵を探すミニチャレンジが含まれます):

28.3秒の実演プロセス:動画ではまず紙面の線画が立体的なシーンへと立ち上がり、シーンの実演(温かい飲み物や電池の断面クローズアップ、ローアングルでの本の落下とエネルギー缶の連動を含む)が再生され、続いて全ページ表示に戻って予測の選択肢とめくり紙片(Why)が示され、最後にオブジェクトをクリックしてエネルギー缶を点灯させる様子が示されます。
実際の授業では、教師が生徒に「まず予測してから実演を観察する」よう促すことが推奨されます。元の教材ページでは各モジュールを個別に体験できるようになっており、動画ではそれらの操作を紹介しています。

1. 予測(Predict):観察の前に素朴概念を顕在化させる

教材の左ページには、本の落下に関する単一選択問題が提示されています:

「本が本棚から落ちて着地した。もともとあったエネルギーは今どこへ行っただろうか?」(The book falls off the shelf and lands. Where is its energy now?)
選択肢:使い果たされた(It has been used up) / 周囲の熱エネルギーの中に移った(In the thermal stores around it) / 依然として位置エネルギーの中にある(Still in its gravitational store)

本が落ちる例をとると、系統的な学習を経ていない生徒は直感的に「エネルギーは使い果たされた」を選びがちです。指導上、教師はまず生徒に選択をさせ、予測を行うことで自らの素朴概念を自覚させる契機とすることが推奨されます。思考をスキップしてそのままアニメーションを観てしまうと、生徒は3Dの動的なエフェクトだけに目を奪われ、背後にある保存則の問題を見落としやすくなります。

2. 実演(Watch):制御された視点での物理的事実

実演をトリガーすると、カメラがスムーズにシーンへと入り込みます。まず温かい飲み物のクローズアップで熱エネルギーの貯蔵を示し、次に電池の断面へ切り替わって化学エネルギーの貯蔵を示し、その後ローアングルの側面視点に移って本棚と本を観察します。本が落下する過程において、高さが低くなるにつれて位置エネルギー(Gravitational Store)缶が減少し、運動エネルギー(Kinetic Store)缶がそれに応じて増加します。着地して衝突すると運動エネルギーはゼロになります。3Dカメラの役割は、落下の高さ h とエネルギー缶の数値変化を同一の視野に収め、幾何学的空間とエネルギーの増減との直感的な結びつきを構築することにあります。

3. 操作(Try):シーンの中でエネルギー貯蔵のマッピングを構築する

実演が一段落すると、シーンは操作可能な状態に入ります。生徒はシーン内の具体的なアイテム(高い場所にある本、温かい飲み物、引き伸ばされたバネ、電池など)や下部のボタンをクリックして、右ページの対応するエネルギー缶を点灯させることができます。この段階の設計目標は、具体的なアイテムと8種類のエネルギー貯蔵との間に一対一の対応関係を確立させることであり、条件制御実験を行わせることではありません。

4. 解説(Explain):紙片をめくって認識を照合する

左ページには「Why? (lift the flap)」という折りたたみ紙片がデザインされています。生徒がクリックして紙片をめくると、元の教材に記載された原理の解説を読むことができます(以下はその意訳です):

「落下時、本の位置エネルギーは空になり運動エネルギーへと移ります。着地時、このエネルギーは本、床、空気の熱エネルギー貯蔵へと移動し、一部は音の伝播を伴います。エネルギーは消費されて尽きたのではなく、利用しにくい場所へと分散したのです。」

この解説は、予測問題における「使い果たされた」という典型的な直感に対して、エネルギー散逸の視点から「力学的エネルギーが環境の熱エネルギー(内部エネルギー)へと変換された」という保存則の理解を助けます。

5. チャレンジ(Challenge):8種類のエネルギー貯蔵をすべて見つけるタスクフィードバック

基礎的な理解にとどまらず、元の教材には「すべての缶を点灯させる:8つの貯蔵すべてを見つけよう」(Light every jar: find all eight stores)という小さな課題が用意されています。生徒はシーンの中を探求してすべてのエネルギー貯蔵の種類を見つけ出し、即時のフィードバックを得ることで、完全な学習サイクルが完結します。


物理コアと帳簿のメタファー:エネルギーは流体ではない

コードの実装に着手する前に、アニメーション制作において歪められやすい2つの物理的・教育的概念を整理しておく必要があります。

エネルギー缶は「会計口座」であり、実体のある容器ではない

本授業では、系のエネルギー変化を記録するために「エネルギー貯蔵と伝達経路(Stores and Pathways)」モデルを採用しています:

  • 貯蔵(Stores):系が特定の物理的状態においてエネルギーを保持する形態(運動エネルギー、重力による位置エネルギー、弾性エネルギー、熱エネルギー貯蔵/内部エネルギー、化学エネルギー、磁気エネルギー、静電エネルギー、核エネルギーなど)。
  • 経路(Pathways):異なる貯蔵の間でエネルギーが移動する過程のメカニズム(力学的仕事、電気的仕事、熱移動、放射)。

教材内で発光する「エネルギー缶」や、物体と缶の間を流れる光のラインは、いずれも教育上の観察を容易にするための視覚的なメタファー(比喩)であり、エネルギー缶も光のエフェクト自体も実体のある物質ではありません。貯蔵と経路の区別は具体例で理解できます:

  • 電池の内部に保持されているのは化学エネルギー貯蔵(Chemical Store)です。回路に接続して電球を点灯させるとき、回路内でエネルギーが伝達されるプロセスは電気的仕事の経路(Electrical Work Pathway)であり、電池の中に「電流」が蓄えられているわけではありません。
  • 毛皮で摩擦した風船は静電エネルギー貯蔵(Electrostatic Store)に分類されます。

8種類のエネルギー貯蔵は、本授業が特定の指導要領(OCR J259 など)に基づいて採用した分類体系です。元の教材の教師用ページには、教育基準によって体系が異なることが明記されています。例えば Cambridge IGCSE では7種類のエネルギー貯蔵しか記載されておらず(磁気エネルギーを独立させていない)、AQA の仕様本文ではこれら8種類の名称を一つひとつ列挙していません。教材設計においては、普遍的な唯一の基準ではなく、特定の教育モデルに基づく選択として提示されるべきです。

本ガイドの単純化された教育用物理モデル

本ガイドでは、独自の教育プロトタイプの物理モデルとして、空気抵抗のない自由落下の加速モデルを採用しています:

  • 地表付近の一様な重力場において、重力場の強さを g = 9.8 N/kg と設定します(教科書によっては 10 N/kg を採用する場合もあり、教材内ではパラメータ切り替えが可能です)。
  • 本が着地して静止したときの重心の高さを位置エネルギーの基準面(ゼロ点)とし、y は本の底面から地面までの隙間を表します。本の質量 m = 1.0 kg、本棚の初期の高さ h0 = 1.5 m は教育上の設定値です(元の教材の教師用ページにも、現実には標準的な本の重さや棚の高さはないと記されています)。
  • 本棚から静かに手放された本は、重力の作用を受けて初速度 0 の加速落下運動を行います(等速落下ではありません)。初期静止時の位置エネルギー: Ep = m · g · h0 = 1.0 × 9.8 × 1.5 = 14.7 J (Every Joule の画面では丸められた数値 15 J と表示されます。エンジニアリングの実装では、コード内部で 14.7 J の精密な計算を行い、UI上では整数値として表示させることができます)。
  • 高さ y まで落下したとき: Ep(y) = m · g · y Ek(y) = m · g · (h0 − y) 落下中の全工程において、力学的エネルギーの総量 Ep + Ek は厳密に 14.7 J の保存を保ちます。
  • 着地の瞬間(y = 0):衝突による変形およびそれに伴う音の散逸は、本モデルでは瞬時に完了するプロセスとして単純化されています。本の運動エネルギーはゼロになり、系の全 14.7 J は本、床、周囲の環境の熱エネルギー貯蔵(内部エネルギー)に計上されます。授業においては生徒に対し、「音は衝突時に力学的仕事によって空気を乱してエネルギーを伝える経路であり、最終的には同様に周囲の環境の熱エネルギー貯蔵へと散逸するものであって、14.7 J の熱・内部エネルギーとは別に余分なエネルギーが存在するわけではない」と説明する必要があります。

ここでの Eth は今回の落下によって生じた内部エネルギーの増分のみを記録します。初期状態を 0 J としているのは、本、床、空気に最初から内部エネルギーが存在しないという意味ではありません。

デフォルトのパラメータでは、本棚の上で 14.70 J のすべてが位置エネルギーにあります。道のりの半分まで下降したとき、位置エネルギーと運動エネルギーはそれぞれ 7.35 J ずつになります。着地して静止した後は、14.70 J のすべてが物体および環境の内部エネルギーに計上されます。3つの項の合計は常に 14.70 J を保ちます。

本の位置が変わると、3つのエネルギーはどう連動する?

空気抵抗のない自由落下の単純化した教育用モデルに基づく(m = 1.0 kg, h₀ = 1.5 m, g = 9.8 N/kg)。本ガイドの2次元状態イメージです。スライダーはすでに下降した距離の割合を表し、時間を表すものではありません。図中の位置と3つの表示値は同一の状態から算出されています。

単一の帳簿:本棚の上で位置エネルギー 14.70 J → 移動距離の半分で位置エネルギー・運動エネルギー各 7.35 J → 地面に衝突して静止した後に 14.70 J が物体および環境の内部エネルギーに計上。3項の合計は 14.70 J を維持します。

位置エネルギー14.70 J
運動エネルギー0.00 J
内部エネルギー増分0.00 J
本棚 1.5m
1 kg
1.50m
地面 0m
位置エネルギー缶 (Ep = mgh) 14.70 J
運動エネルギー缶 (Ek = ½mv²) 0.00 J
物体および環境の内部エネルギー (着地後) 0.00 J
現在の高さ h 1.50 m
位置エネルギー Ep = 1.0 × 9.8 × h 14.70 J (約 15 J)
運動エネルギー 落下中 Ek = 14.70 − Ep 0.00 J
3項の合計(物体および環境を含む) 14.70 J (一定)
本棚の上で静止:系のすべての力学的エネルギーは位置エネルギー(14.70 J)として保持されています。元の教材では丸めた値の 15 J と表示されます。

エンジニアリングの罠を避ける:単一の情報源(Single Source of Truth)

初心者がAIに指示を出して3Dインタラクティブ教材を作成させる際、最も陥りやすいのが表示と計算の同期が崩れる問題です:

  • AIが requestAnimationFrame で本の落下のメッシュ移動を記述する;
  • それとは別に setInterval で数字を15から0までカウントダウンするタイマーを記述する;
  • エネルギーバーの高さがさらにCSSのグラデーションアニメーションにバインドされている。

ブラウザで一度でもフレーム落ちが発生すると、本はすでに地面に衝突しているのに、エネルギー缶は宙に浮いたまま 7 J を示しているという、ちぐはぐな破綻が生じることになります。

中核となる設計思想:アニメーションと数値は、統一された単一の物理状態計算から導出されなければなりません。

特に注意すべき点として、正規化変数 progress は初期落下高さに対してすでに下降した距離の割合(すなわち (h0 - y) / h0、値の範囲は 0.0 から 1.0)として定義されており、落下時間の単純なパーセンテージではありません。

  • 物理時間と再生マッピング:抵抗のない自由落下において、物理的な合計時間は加速度によって決まります:freeFallTime = Math.sqrt(2 * h0 / g)。h0 = 1.5 m, g = 9.8 N/kg を代入すると、実際の落下時間はわずか約 0.55 秒です。この速度は教室での観察には速すぎるため、教育デモでは観察用に引き延ばした表示時間(例: displayDuration = 3.0 s)を設定するのが一般的です。再生時、アニメーション再生の経過正規化時間 tau = elapsed / displayDuration を物理時間 t = tau * freeFallTime にマッピングし、初速度 0 の等加速度直線運動の変位公式から距離の割合を導出します: progress = Math.min(1.0, Math.max(0.0, (t / freeFallTime) ** 2))
  • 手動スライダーの役割:ページ内の手動スライダーにより、生徒は距離の進捗 progress に応じて各高さでの静止したエネルギーのスライスを段階的に確認できます。これにより詳細な比較が可能となり、時間を巻き戻す現実の物理実験であるかのように錯覚させることも防げます。
  • 状態の構造:位置の進捗だけでなく、システムは質量と高さ、再生/一時停止状態、および生徒の予測状態を独立して維持する必要があります。カメラの視点位置も落下の進捗に応じて補間追従させることができ、「グローバルに単一のスカラー値しか使わない」ことに固執する必要はありません。

状態導出関数は動的パラメータを受け取り、境界値や不正な入力に対する防御的な処理を行う必要があります:

// 物理状态派生函数:接收进度、质量、重力场强与初始高度
function computePhysicsState(progress, m = 1.0, g = 9.8, h0 = 1.5) {
  // 参数合法性防御
  const validM = Number.isFinite(m) && m > 0 ? m : 1.0;
  const validG = Number.isFinite(g) && g > 0 ? g : 9.8;
  const validH0 = Number.isFinite(h0) && h0 > 0 ? h0 : 1.5;
  
  // progress 强制截断到 [0, 1],代表已下降距离占 h0 的比例
  const p = Math.min(1.0, Math.max(0.0, Number.isFinite(progress) ? progress : 0.0));
  
  const total = validM * validG * validH0;
  const y = validH0 * (1.0 - p); // 书底距离地面的高度
  const ep = validM * validG * y;
  const ek = p < 1.0 ? Math.max(0.0, total - ep) : 0.0;
  const eth = p >= 1.0 ? total : 0.0;
  
  return { progress: p, y, ep, ek, eth, total };
}

3Dレンダリングにおいては、物理的な幾何座標とメッシュの中心座標を厳格に区別する必要があります: 本の直方体メッシュの厚さを b、ジオメトリの中心を原点とすると、物理的な高さ y は本の底面から地面までの隙間を表します(本が着地して静止したときの重心の高さを位置エネルギーのゼロ点基準とします)。メッシュをレンダリングする際、モデルのワールド座標は bookMesh.position.y = y + b / 2 となる必要があります(あるいはモデルを底面が原点となる Group に配置します)。本が棚にあるときは y = h0 であり、本の底面は高さ h0 の本棚の表面にぴったりと乗ります。着地時は y = 0 であり、本の底面が地面に接して center.y = b / 2 となり、初期の浮遊やめり込みの罠を解消できます。また、シーンに複雑な3D剛体衝突シミュレーションは不要です。本を棚の端に置いて手放すか棚板をどかす動作はアニメーションをトリガーするための表現形態に過ぎず、本が棚板の内部を直接貫通して落下するような描写は避けなければなりません。


ラウンド別の段階的実装:空白のディレクトリから独立したプロトタイプを立ち上げる

長大なプロンプトを一度に与えて、AIに完全な3D教材を一発で生成させようとしてはなりません。大規模言語モデルは、3次元幾何学の構築、ライティングとマテリアル、物理計算、DOMインタラクション、インターフェースのレイアウトを同時に処理しようとすると、破綻をきたしやすくなります。

正しい道筋は段階的な反復開発(Iterative Delivery)です。各ラウンドで1つのことだけに集中し、動作が検証できてから次のプロンプトを与えます。

まずPCのターミナルで Node.js と npm の環境を確認します:

node --version
npm --version

現在の Vite 公式ドキュメントでは、Node.js のバージョンとして 20.19+ または 22.12+ が求められています。現在の Node.js LTS バージョンを使用し、互換性を確認することをお勧めします。続いてターミナルでプロジェクトを初期化し、依存関係をインストールします:

mkdir energy-interactive-lesson
cd energy-interactive-lesson
npm init -y
npm install three
npm install -D vite

インストール完了後、ワークスペース内のファイル編集機能を備えたAIプログラミングツールでこの energy-interactive-lesson フォルダを開きます。各ラウンドのプロンプトでは、ツールがワークスペース内で直接対応するファイルを作成・更新することを求めています。対話のみをサポートするウェブチャット画面で使用する場合は、生成された完全なコードをファイル名に従って手動でコピーし、該当ファイルへ貼り付けてください。

プロジェクトの基準ファイル構成は以下の通りです:

energy-interactive-lesson/
├── index.html
├── package.json
├── package-lock.json
├── style.css
└── main.js

生成された package-lock.json は保持しておき、後で npm ci によって環境を確実に再現できるようにします。これにより、今回実際に記録された依存関係のバージョンを引き継ぐことができます。index.html では <script type="module" src="/main.js"></script> を通じてモジュールスクリプトを読み込み、<link rel="stylesheet" href="/style.css"> でスタイルを関連付ける必要があります。


各ラウンドが完了したら、まず検収項目に沿って操作確認を行います。問題が発生した場合は、実際の挙動、コンソールのエラー、関連ファイルを同一セッションに戻して修正させ、検収を通過してから次のラウンドに進みます。

第1ラウンド:物理コアと最小限の3Dシーンを成立させる

プロンプトに関する注記:以下のプロンプトは本ガイドが独自に設計したものであり、原作者が非公開としているオリジナルの指示ではありません。今回は Codex が空のディレクトリからラウンドごとに順次読み込んで実行し、ブラウザ上での操作検証をパスしたものです。入力内容は implementation/prompts/ に保存されており、各ラウンドの完全なコードスナップショットが保持されています。ただし、これは任意のモデルが単一試行・無介入で完全に同一のコードを出力することを保証するものではありません。読者が実践する際は日本語・英語のいずれかを選択して送信し、各ラウンドの検収ポイントやトラブルシューティング記録と照合して問題がないことを確認してから次のラウンドに進んでください。

日本語プロンプト(第1ラウンド) · 開いて表示・コピー
あなたは物理教育とThree.jsに精通したフロントエンドエンジニアです。「物理エネルギー変換のインタラクティブ教材」の最小限のプロトタイプを構築してください。

【技術スタック】
- バニラJavaScript (ES Modules) + Three.js + Vite。
- ルートディレクトリには index.html, style.css, main.js を含めます。index.html ではモジュールスクリプト経由で main.js を読み込み、style.css をリンクしてください。

【教育および物理ルール】
1. 物理パラメータと座標系:
   - 本の質量 m = 1.0 kg、本棚の初期の高さ h0 = 1.5 m、重力場の強さ g = 9.8 N/kg に設定。
   - 全エネルギー total = m * g * h0 = 14.7 J。
   - 本のモデル(直方体)の厚さを b = 0.2 m に設定。物理的な高さ y は本の底面から地面までの高さを表します。レンダリング時、モデルの中心座標は center.y = y + b / 2 となります。
   - 本棚の天板の上面は y = 1.5 m に位置します。初期状態では本の底面が本棚上に乗り(center.y = 1.6 m)、着地時は y = 0 m で本の底面が地面上に乗ります(center.y = 0.1 m)。モデルのめり込みや浮遊は厳禁です。
2. エネルギーの記録と状態の導出:
   - progress を、すでに落下した距離の初期高さに対する割合(0.0 から 1.0 の範囲)と定義します。
   - 落下フェーズ(progress < 1.0):y = h0 * (1.0 - progress)、Ep = m * g * y、Ek = total - Ep、Eth = 0。
   - 着地の瞬間(progress >= 1.0):衝突と音の散逸は瞬時に完了するものと単純化し、y = 0、Ep = 0、Ek = 0、Eth = total = 14.7 J。
   - 導出関数 computePhysicsState(progress, m, g, h0) ではパラメータの妥当性チェックと progress のクランプ(0 から 1)を行ってください。
3. 実際の物理時間と再生時間のマッピング:
   - 自由落下の合計時間 freeFallTime = Math.sqrt(2 * h0 / g) ≈ 0.55 s。
   - 授業での観察を容易にするため、デモの表示時間を displayDuration = 3.0 s に設定。再生中の物理時間 t = (elapsed / displayDuration) * freeFallTime、移動距離の割合 progress = Math.min(1.0, (t / freeFallTime) ** 2)。
   - 手動スライダーは距離の割合 progress を直接制御し、生徒が各高さでの状態を段階的に確認できるようにします。

【インターフェースと3Dシーン】
1. ページ左側:明確なHTMLのエネルギー缶を3つ配置(位置エネルギー Ep、運動エネルギー Ek、熱・内部エネルギー Eth)。現在の数値を小数点以下2桁でリアルタイム表示し、高さの充填パーセンテージも表示。
2. ページ右側:Three.js のキャンバス。透視投影カメラ、環境光/平行光、地面グリッド(y = 0)、棚の端にある本棚と本の直方体を配置。
3. インタラクション操作部:
   - スライダー(Range Input、0〜100%)。ドラッグ時に本の高さとエネルギー缶を同期更新。
   - 実際に視認できるHTMLの「本を落とす(Drop)」ボタンと「リセット(Reset)」ボタン。マウスクリックおよびキーボード(Tab/Enter/Space)によるアクセシビリティ操作に対応。

現在のプロジェクトワークスペースに完全な index.html、style.css、main.js を作成してください。ファイルへの直接書き込みができない場合は、ファイル名ごとに完全なコードを出力して保存できるようにしてください。
English Prompt (Round 1) · 英語原文を表示・コピー
You are a front-end engineer proficient in physics pedagogy and Three.js. Please build a minimal prototype for a "3D Interactive Energy Transformation Lesson".

[Tech Stack]
- Vanilla JavaScript (ES Modules) + Three.js + Vite.
- Root directory must contain index.html, style.css, main.js. index.html must load main.js via module script and link style.css.

[Pedagogy & Physics Rules]
1. Physical Parameters & Coordinates:
   - Parameters: mass m = 1.0 kg, initial shelf height h0 = 1.5 m, gravitational field strength g = 9.8 N/kg.
   - Total energy: total = m * g * h0 = 14.7 J.
   - Book mesh thickness b = 0.2 m. Physical height y represents distance from book bottom to ground. Mesh center is rendered at center.y = y + b / 2.
   - Shelf surface is at y = 1.5 m. Initially the book rests flush on the shelf (center.y = 1.6 m); at ground y = 0 m (center.y = 0.1 m). Avoid clipping through ground or floating.
2. Energy Accounting & State Derivation:
   - Define progress as fallen distance ratio relative to h0 (clamped between 0.0 and 1.0).
   - In-flight (progress < 1.0): y = h0 * (1.0 - progress), Ep = m * g * y, Ek = total - Ep, Eth = 0.
   - On impact (progress >= 1.0): impact deformation and sound dissipation are modeled as instantaneous, y = 0, Ep = 0, Ek = 0, Eth = total = 14.7 J.
   - computePhysicsState(progress, m, g, h0) must validate parameters and clamp progress to [0, 1].
3. Real Physics & Display Timing:
   - Real free-fall duration: freeFallTime = Math.sqrt(2 * h0 / g) ≈ 0.55 s.
   - For pedagogical observation, set animated displayDuration = 3.0 s. During playback, physical time t = (elapsed / displayDuration) * freeFallTime, and progress = Math.min(1.0, (t / freeFallTime) ** 2).
   - A manual slider directly adjusts distance progress to allow stepping through height states.

[UI & 3D Scene Requirements]
1. Left panel: 3 visible HTML energy jars (Gravitational Ep, Kinetic Ek, Thermal Eth) showing real-time values (2 decimal places) and proportional bar fills.
2. Right panel: Three.js canvas featuring PerspectiveCamera, AmbientLight, DirectionalLight, ground plane at y = 0, a shelf, and the book mesh placed at the shelf edge.
3. Controls:
   - A slider (0 to 100%) to inspect progress manually.
   - Real, visible HTML "Drop Book" and "Reset" buttons, fully accessible via mouse and keyboard (Tab/Enter/Space).

Create complete index.html, style.css, and main.js files in the current project workspace. If you cannot write files, output the complete code under each filename so I can save it.
検収とデバッグ(第1ラウンド)

ターミナルで開発サーバーを起動します:

npx vite

ブラウザでプロンプトに表示されたローカルアドレス(通常は http://localhost:5173)を開きます。

  • 合格基準:
    1. ページが正常に表示され、左側に3本のエネルギーバーと数値が現れ、右側の3Dシーン内で本が本棚の上に安定して静止し、本の底面が棚板にぴったりと接地していること。
    2. 下部の進捗スライダーをドラッグすると、本が移動距離の割合に応じて滑らかに落下し、左側の Ep が減少して Ek が増加し、落下中の力学的エネルギーの総和が常に 14.70 J を維持していること。
    3. 「本を落とす」をクリックすると、本が約3秒間の教育デモ時間の中で滑らかに加速落下すること。着地の瞬間に本の底面が地面に密着してめり込まず、Ek がゼロになり、Eth が 14.70 J に切り替わること。
  • よくあるエラーと修正法:
    • ブラウザが Cannot use import statement outside a module と警告する場合:index.html 内の <script> に type="module" 属性(<script type="module" src="/main.js"></script>)が宣言されているか確認してください。
    • 本が初期状態で浮遊しているか、着地時にめり込む場合:メッシュの中心座標変換を確認し、center.y = y + b / 2 が使用されているかを確かめてください。
    • 本が棚板を突き抜けてしまう場合:追加の修正プロンプトを送ります:「落下させる際は棚板を非表示にするか移動させ、本棚の初期状態にリセットされた時のみ復帰させてください。垂直落下の動きで木板を突き抜けさせないようにしてください。」

第2ラウンド:3Dクリックピッキングと滑らかなカメラワークの追加

最小限の物理ロジックが成立しました。続いて、シーンに直感的な3Dタッチ操作を導入し、生徒が3Dオブジェクトをクリックしてアクションを起こせるようにします。

日本語プロンプト(第2ラウンド) · 開いて表示・コピー
第1ラウンドの物理計算とエネルギーバーの同期ロジックを保持した上で、main.js、style.css、および必要な index.html の操作部を更新し、3Dレイキャスターによるピッキング(Raycaster Picking)、ダイナミックなカメラワーク、インタラクション制御を追加してください。

【修正要件】
1. 3Dオブジェクトのクリックピッキング(Raycaster):
   - THREE.Raycaster を使用します。正規化座標を計算する際は、必ず canvas.getBoundingClientRect() の相対オフセットとサイズを基準に計算し、全画面の window の幅・高さを直接使用することは厳禁とします。
   - Pointer Events を使用してポインター操作を監視し、わずかなドラッグ移動のしきい値(例: 6px 超はクリックではなくドラッグと判定)を設けてください。ページのデフォルトの拡大縮小やジェスチャースクロールを無効化することは絶対に避けてください。
   - 本の上にマウスカーソルを乗せた(ホバー)ときは Emissive(自己発光)ハイライトのフィードバックを与え、カーソルを pointer に変更します。本をクリックまたはタップすると落下がトリガーされるようにします。
2. カメラワークと表示時間:
   - 初期状態は本棚と本全体を捉えるパノラマ視点にします。落下がトリガーされたら、カメラを地面のローアングルへスムーズに補間(lerp)して近づけ、本が地面に衝突するクローズアップを見せます。
   - 3.0 秒の表示時間は教育的な観察のための設計である旨を明記してください(実際の自由落下は約 0.55 秒)。
   - 「リセット」クリック時は、カメラがパノラマ視点へスムーズに復帰するようにします。
3. 操作部とキーボードアクセシビリティ:
   - ページ上に実際に視認できるHTMLの「落とす」「一時停止/再開」「リセット」ボタンを保持し、Tab、Enter、Space キーによる操作に対応させます。
   - グローバルなスペースキー(Space)で一時停止/再生を切り替えられるようにしますが、必ずフォーカス判定を行ってください。現在 input や button などのインタラクティブ要素にフォーカスがある場合は、その要素のネイティブなデフォルト挙動を妨げてはなりません。Esc キーでリセットします。
4. レスポンシブとアクセシビリティモード:
   - ResizeObserver(または window の resize イベント)を使用してキャンバスコンテナのサイズ変化を監視し、レンダラーのサイズとカメラのアスペクト比を動的に更新して、画面の歪みや引き伸ばしを防ぎます。
   - prefers-reduced-motion または静止モードに対応し、モーション軽減モードではスライダーのステップ操作によって直接観察できるようにします。

現在のプロジェクト内の該当ファイルを更新してください。ファイル書き込みができない場合は、ファイル名ごとに完全なコードを出力してください。
English Prompt (Round 2) · 英語原文を表示・コピー
Keeping all physics calculations and energy bar synchronization from Round 1 intact, update main.js, style.css, and any required index.html controls to add Three.js Raycaster picking, camera framing, and accessible controls.

[Requirements]
1. Raycaster 3D Picking:
   - Implement THREE.Raycaster. Calculate normalized pointer coordinates strictly from canvas.getBoundingClientRect() relative offset and dimensions; do NOT assume full-window coordinates.
   - Use Pointer Events with a drag movement threshold (e.g. > 6px considered dragging rather than click/tap). Never disable whole-page scrolling or pinch-to-zoom gestures.
   - Subtle emissive highlight and pointer cursor on hover; clicking or tapping the book triggers the fall.
2. Camera Framing & Display Duration:
   - Initial perspective frames the entire shelf and book. Upon drop initiation, smoothly lerp camera to a low-angle close-up of the landing zone.
   - Retain the 3.0 s display duration as an intentional pedagogical choice for clear observation (contrasted with the ~0.55 s real fall time).
   - Resetting smoothly restores the initial wide camera framing.
3. Accessible Controls & Keyboard:
   - Keep real, visible HTML controls for "Drop", "Pause/Resume", and "Reset", fully operable via Tab, Enter, and Space.
   - Add a global Spacebar shortcut to toggle pause/resume, ensuring it does NOT intercept default behavior when the focused element is an input, button, or other form control. Esc resets to initial state.
4. Responsiveness & Motion Sensitivity:
   - Use ResizeObserver (or window resize event) to dynamically adjust canvas dimensions and camera aspect ratio without stretching.
   - Support prefers-reduced-motion / static step mode, allowing direct slider stepping without rapid motion transitions.

Update these files in the current project workspace. If you cannot write files, output the complete code under each filename.
検収とデバッグ(第2ラウンド)
  • 合格基準:
    1. マウスを本に乗せたときにハイライトフィードバックとポインターカーソルが表示されること。キャンバス内で本をクリックすると正常に落下がトリガーされ、モバイル端末でもデフォルトのジェスチャーがブロックされることなくページが上下スクロールできること。
    2. 落下中、カメラが地面のローアングルへ滑らかに寄り、3秒間の教育デモで位置エネルギーから運動エネルギーへの変換プロセスが明確に観察できること。
    3. スペースキーを押して落下の停止と再開ができること。ボタンにフォーカスがある状態でスペースを押した場合、ボタン自体の挙動が優先され、イベントの競合が起きないこと。Esc キーで即座に初期状態へ復帰すること。
  • よくあるエラーと修正法:
    • ピッキング位置がずれる、またはクリックが反応しない場合:正規化デバイス座標の計算を確認し、ページのスクロールやキャンバスの余白の影響を排除した (e.clientX - rect.left) / rect.width * 2 - 1 が使われているかを確かめてください。

第3ラウンド:ペーパークラフト線画ビジュアルと「予測—解説」指導サイクル

3D教材が過度で安っぽいプラスチックのような質感に覆われていると、認知的集中が削がれてしまいます。Every Joule の真髄は、ページを白黒スケッチ調の「ノート」に見立て、カラフルなエネルギー缶を視覚的な主役にし、さらに授業前の予測と授業後の結果発表紙片を完備している点にあります。

日本語プロンプト(第3ラウンド) · 開いて表示・コピー
index.html、style.css、main.js を更新し、UIのビジュアルを「ペーパークラフト・ラインアート風」にアップグレードした上で、「予測—実演—操作—解説」という教育サイクルを完備してください。

【ビジュアルスタイルのアップグレード】
1. 背景とマテリアル:
   - 落ち着いた紙のアイボリーホワイトの背景色(#faf9f6、ダークモードは #1a1a1c)を採用。
   - 3Dモデルには明るい色の拡散反射マテリアルと EdgesGeometry による輪郭線を採用し、手描きのペーパークラフト・スケッチの質感を表現。
   - エネルギー缶には発光色でアクセントを付与:位置エネルギーはスカイブルー、運動エネルギーはエメラルドグリーン、熱・内部エネルギーはアンバーイエロー。
2. モバイル対応とフォールバック:
   - レスポンシブレイアウト:デスクトップでは左右2カラム、モバイルでは上下スタックレイアウトを採用し、3Dのクローズアップカメラワーク時でもエネルギー缶の数値が隠れず明瞭に見えるように配置。
   - ブラウザが WebGL をサポートしていない場合は、基本的なHTMLテキスト、ボタン、数値・公式の解説カードを表示する優雅なフォールバック(Graceful Degradation)を行い、中核となる教育概念が閲覧できるようにします。

【指導プロセスコンポーネント】
1. 予測カード(Predict Card):
   - 問題:「予測:本が本棚から落ちて地面に衝突したとき、もともと持っていたエネルギーは今どこへ行ったでしょうか?」
   - 選択肢:
     A. 完全に使い果たされた
     B. 周囲の環境や本自身の熱エネルギー(内部エネルギー)に移った
     C. 依然として位置エネルギーの中に残っている
   - 進行の説明:「操作の前にまず予測する」流れを本ガイド推奨の任意の指導設計として位置づけ(元の教材による強制ではない)、「自由探究/直接実演」の切り替えスイッチを提供して、教師や生徒が必要に応じて予測を先行させるか直接探究するかを選べるようにします。
   - 生徒が選択肢を選んだ時点では、正誤を事前にネタバレしないようにします。
2. 折りたたみ解説カード(Lift-the-flap "Why?"):
   - 本が着地した後に「なぜ? クリックして解説を開く」という折りたたみカードを表示。
   - 展開すると完全な原理の解説を表示:落下の仕事(位置エネルギーから運動エネルギーへの変換)と着地時の散逸(運動エネルギーが最終的に本・床・空気の内部エネルギーに移行。一部は音として伝播した後に散逸し、最終的に Eth = total に含まれる)を明確に区別し、選択肢 A(エネルギーは跡形もなく消え去ることはない)と C(高さがゼロになり位置エネルギーは空になる)がなぜ誤りであるかを詳細に解説。同時に生徒が最初に選んだ予測選択肢を並べて比較表示します。

現在のプロジェクト内の完全な index.html、style.css、main.js を更新してください。ファイル書き込みができない場合は、ファイル名ごとに完全なコードを出力してください。
English Prompt (Round 3) · 英語原文を表示・コピー
Update index.html, style.css, and main.js to adopt a papercraft line-art visual style and implement the complete "Predict-Watch-Try-Explain" pedagogical flow.

[Visual & Layout Enhancements]
1. Styling & Papercraft Aesthetics:
   - Warm paper background (#faf9f6, with dark mode #1a1a1c).
   - 3D models with clean matte surfaces and ink EdgesGeometry outlines to create a minimalist papercraft look.
   - Reserve vivid emissive colors exclusively for energy jars (Sky Blue for Ep, Emerald Green for Ek, Amber Yellow for Eth).
2. Mobile & Fallback Support:
   - Responsive layout: side-by-side columns on desktop, vertical stacked layout on mobile to prevent 3D close-ups from obscuring energy numbers.
   - WebGL fallback: If WebGL context is unavailable, display a clean fallback card with HTML text, formula steps, and numeric readouts so learning is uninterrupted.

[Pedagogical Flow Panel]
1. Predict Card:
   - Prompt: "Predict: The book falls off the shelf and lands. Where is its energy now?"
   - 3 options:
     A. It has been used up
     B. In the thermal stores around it
     C. Still in its gravitational store
   - Interaction guidance: Implement predicting-before-dropping as an optional recommended pedagogical scaffold (not a mandatory original lesson lock), providing a "Free Explore / Direct Demo" mode toggle so educators or students can choose to explore directly without forced gating.
   - Selecting an option does not prematurely reveal correctness.
2. Lift-the-flap Explanation ("Why?"):
   - Upon landing, display a "Why? (Click to lift flap)" card.
   - Unfolding provides the full physical explanation: distinguishing mechanical work (Ep -> Ek) from landing dissipation (Ek ultimately becomes internal energy of the book, floor, and air; the small amount first carried by sound is already included in Eth = total after dissipation). Explicitly explain why A (energy cannot vanish) and C (zero height means zero gravitational store) are misconceptions, displaying the user's initial prediction side-by-side for comparison.

Update complete index.html, style.css, and main.js files in the current project workspace. If you cannot write files, output complete code under each filename.
検収とデバッグ(第3ラウンド)
  • 合格基準:
    1. ページ全体にペーパークラフト・スケッチの質感が現れ、モバイル表示で上下に破綻なくレイアウトされ、エネルギー数値が常に隠れず見えていること。
    2. 予測カードの選択が正常に行え、教師が推奨の予測誘導モードと直接実演モードを自由に切り替えられ、予測選択時に正解が先に出てこないこと。
    3. 本の着地後に「Why?」紙片をめくると、解説文で各選択肢の物理的な誤りが詳細に分析され、ユーザーが事前に選んだ予測と並べて対照表示されること。

第4ラウンド:教師用パラメータドロワーと本番ビルドの検収

教材に教師用の準備ノートビューを追加し、指導上の前提やパラメータを公開して、最終的なプロダクションビルドを行います。

日本語プロンプト(第4ラウンド) · 開いて表示・コピー
現在のプロジェクトを改善し、「指導準備ノートパネル(Teachers' Notes)」を追加して動的なパラメータ調整に対応させ、エンジニアリング標準を満たしてください。

【機能要件】
1. 教師用準備ドロワーと動的パラメータ調整(必須):
   - ページの右上に「指導者向け解説(Teachers' Notes)」の切り替えボタンを追加。ドロワーはキーボード操作(Esc キーで閉じる)に対応し、閉じた後はフォーカスをトリガーボタンに戻します。
   - ドロワー内に教育的背景の説明を含める:
     * モデルの単純化に関する説明:空気抵抗を無視し、衝突と音の散逸を瞬時に完了するものとして単純化していること。
     * カリキュラム基準の違いに関する説明:本レッスンではデフォルトで g = 9.8 N/kg(AQA基準)を採用しているが、教科書によっては g = 10 N/kg を採用して理論値が異なる場合があること(例: m=1, h0=1.5 のとき 15.0 J)。
     * 帳簿メタファーの注意点:エネルギー缶や光のエフェクトは状態の記録モデル(帳簿)であり、実体のある物質ではないことを強調。
   - 教師用パラメータサンドボックス(必ず実装):
     * 質量 m (0.5 kg 〜 2.0 kg)、高さ h0 (1.0 m 〜 2.0 m) を調整するスライダー、および g (9.8 と 10 N/kg) のラジオボタン切り替えを提供。
     * いずれかのパラメータが変更された場合:現在の再生を直ちに一時停止して初期状態にリセット。一般式 total = m * g * h0 に基づいて全エネルギーを再計算。3D本棚の幾何学的な高さ、本の初期位置、カメラの画角を動的に更新。エネルギーバーの最大スケール、数値ラベル、解説テキストを再計算。ロジックやビュー内で 14.7 や 15 をハードコードすることは厳禁。
2. コードとエンジニアリング仕様:
   - コンソールのデバッグコードをすべてクリーンアップし、厳格な ES Module 仕様に準拠させます。
   - ウィンドウやコンテナのサイズ変更時に、Three.js のキャンバスとカメラのアスペクト比が自律的に追従して再描画されるようにします。

現在のプロジェクト内の影響を受けるすべてのファイルを更新してください。ファイル書き込みができない場合は、ファイル名ごとに完全なコードを出力してください。
English Prompt (Round 4) · 英語原文を表示・コピー
Finalize the project by implementing a "Teachers' Notes Drawer" with dynamic parameter controls and strict engineering standards.

[Requirements]
1. Teachers' Notes Drawer & Parameter Sandbox (Required):
   - Add a "Teachers' Notes" toggle button in the top-right corner. The drawer must be keyboard accessible (Esc closes), and focus must return to the toggle button upon closing.
   - Drawer pedagogy content:
     * Model Simplifications: Explicitly clarify that air resistance is omitted and impact/sound dissipation is treated as instantaneous.
     * Specification Differences: Default g = 9.8 N/kg (AQA), noting differences for courses using g = 10 N/kg (yielding 15.0 J when m=1, h0=1.5).
     * Metaphor Warning: Remind teachers that jars and light effects are accounting metaphors, not physical substances.
   - Parameter Sandbox (Must Implement):
     * Controls to adjust mass m (0.5 to 2.0 kg), height h0 (1.0 to 2.0 m), and a toggle between g = 9.8 and 10 N/kg.
     * When any parameter changes: immediately pause playback and reset to initial position; recompute total = m * g * h0 using general formulas; update shelf 3D height, book initial mesh position, and camera framing; update energy bar scale denominators, labels, and explanation readouts. Absolutely NO hardcoded 14.7 or 15 in logic or templates.
2. Engineering Standards:
   - Remove console debug logs and ensure strict ES module imports.
   - Maintain responsive canvas rendering and camera aspect ratio on resize.

Update all affected project files in the current workspace. If you cannot write files, output complete code under each filename.
最終ビルドと検証

ターミナルで Vite の本番ビルドコマンドを実行します:

npx vite build

ビルド成功後、ビルド成果物をローカルでプレビューします:

npx vite preview

コンソールにローカルプレビューのアドレス(例: http://localhost:4173)が出力されます。シークレットウィンドウで開き、以下の検収ポイントを1項目ずつ検証します:

  1. 基準パラメータの照合:m = 1.0, h0 = 1.5, g = 9.8 のとき、初期の全エネルギーは 14.70 J。落下距離の半分(progress = 0.5、すなわち y = 0.75 m)において、Ep = 7.35 J, Ek = 7.35 J となり、両者の和は厳密に 14.70 J を保持していること。
  2. 大パラメータと重力の切り替え:パラメータを m = 2.0, h0 = 2.0, g = 10 に調整すると、全エネルギーが正しく 40.00 J に再計算され、本棚の高さとエネルギーバーの比率が連動して伸びること。
  3. 一時停止とリセットの一貫性:再生途中でパラメータを変更した際、教材が正しく一時停止して新パラメータの初期状態にリセットされ、古い数値が残留しないこと。
  4. キーボードアクセシビリティ:教師用ドロワーを開いた後、Esc キーで正常に閉じ、キーボードフォーカスがトリガーボタンに正確に戻ること。

静的成果物は dist/ ディレクトリにビルドされますが、サブパス(例: GitHub Pages の username.github.io/repo-name/)にデプロイする場合は、vite.config.js 内で base: './' または base: '/repo-name/' を設定して再ビルドする必要があり、任意の静的パスへファイルをそのままアップロードすることはできません。

実行確認の結果と再現トラブルシューティング

今回の実行テストは Node 22.22.3、npm 10.9.8 の環境で実施し、依存関係は Three.js 0.186.1 と Vite 8.3.5 に固定されています(package-lock.json により今回のインストール時のバージョンを固定)。今回自作した3D教材を開く(オンライン版、インストール不要)から直接体験できます。教材の操作画面は中国語です。今回の完全なソースコードパッケージをダウンロードすることもでき、README、ロックファイル、ソースコード、4ラウンドのスナップショット、および今回の自作スクリーンショットとデモ映像が含まれています。解凍後は package.json があるディレクトリに移動して npm ci を実行し、完了後に npm run dev を実行してください。index.html を直接ダブルクリックして開かないでください。4ラウンドの実施における重要な観測値とトラブルシューティングの要点は以下の通りです:

今回自作したThree.js教材。左側に14.70Jのエネルギー帳簿、右側にペーパークラフト線画の本棚と操作コントロール
4ラウンドの基礎プロトタイプの実際の画面。本、棚、地面は動作する Three.js の幾何モデルであり、ソース元のデモと今回の成果物をそれぞれ区別して記載しています。
ラウンド 中核となる検収項目と観測表示値 再現チェックとトラブルシューティングの指針
第1ラウンド(物理コア) スライダー progress = 0.5 時に y = 0.75 m、Ep = 7.35 J、Ek = 7.35 J、Eth = 0 J を正確に読み取り。落下クリックで約3秒間加速落下し、着地の瞬間の表示値は y = 0 m、Ep = 0 J、Ek = 0 J、Eth = 14.70 J で安定。WebGL キャンバスは正常に初期化。 実際の実行時、本を落下させる際は幾何学的条件に合わせるため棚板を同時に取り除く必要があります。モデル生成時に棚板が自動で除去されずにめり込みが発生した場合は、元のプロンプトを変更する必要はなく、そのままコピーして使える修正指示を1行追加してください:「本が落下する際は棚板メッシュを同時に非表示にするか移動させ、本棚の初期状態にリセットされた時のみ再表示して、本と棚板のめり込みを防いでください。」
第2ラウンド(ピッキングとカメラ) キャンバス内で 3D 本メッシュをクリックすると確実に落下がトリガーされること。「落とす」をクリックした後に「一時停止」をクリックすると数値とアニメーションが正確にホールドされること。ボタンにフォーカスがあるときにスペースキーを押すとネイティブのボタンクリックが発火し、グローバルショートカットにフォーカスを奪われないこと。静止ステップモードで 25% 刻みで状態を直接呼び出せること。別タブに切り替えた際は visibilitychange により自動停止し、裏でアニメーションが走り終えてしまうのを防ぐこと。 ピッキング計算は必ず canvas.getBoundingClientRect() の相対オフセットを基準にする必要があります。モバイル環境ではページの上下スクロールがブロックされないよう、> 6px のドラッグしきい値を設けてください。
第3ラウンド(ペーパークラフトと指導サイクル) 初期状態で予測選択肢 A を選択しても状態が記録されるだけで正誤はネタバレされず、「Why?」折りたたみ紙片は隠れたままを維持。本が着地した後に「Why?」を開くと、ユーザーが最初に選んだ A と並べて対照表示され、力学的仕事と衝突散逸の完全な解説が表示されること。手動で選択したテキストフォールバックモードにおいて、純粋な HTML/CSS 構造でもスライダーを中間地点まで操作でき、正確に 7.35 J / 7.35 J が表示されること。 フォールバック機能は WebGL が利用できない場合のグラフィック上のフォールバックであり、物理状態の導出と DOM レンダリングには引き続き JavaScript が不可欠です。「JavaScript を完全に無効化する」ことと混同しないでください。
第4ラウンド(パラメータとビルド) パラメータを m = 2.0 kg, h0 = 2.0 m, g = 10 N/kg に調整すると、全エネルギーが 40.00 J に再計算されること。progress = 0.5 時に同期して y = 1.0 m、Ep = 20.00 J、Ek = 20.00 J が読み取れること。「Why?」解説内の合計値と選択肢の分析が動的に 40 J に同期すること。教師用ドロワーを開いた後に Esc キーを押して閉じると、キーボードフォーカスが正確にトリガーボタンに戻ること。npm run build が成功すること。 Three.js のビルド後、単一チャンクは約 540 kB となり、ターミナルに 500 kB 超のファイルに対する Vite のサイズ最適化警告(Chunk size limit warning)が表示されますが、これは一般的な案内でありビルド失敗ではありません。エラーと誤認しないようにしてください。

再現環境とコマンドラインでのデバッグに関するアドバイス:

  1. ネットワークの再試行と依存関係の整合性:npm install の実行中にネットワークの揺らぎ(レジストリの ECONNRESET など)に遭遇した場合、npm は自動で再試行するか、再実行が必要になります。必ずインストールが完全に完了し、ディレクトリに node_modules が生成されたことを確認してからサーバーを起動してください。起動が早すぎるとターミナルに vite: command not found と表示されますが、依存関係が完全にインストールされた後に再実行すれば復旧します。
  2. 作業ディレクトリとビルドコマンド:空のディレクトリから進める場合、package.json があるプロジェクトディレクトリで npx vite build を実行します。npm run build は package.json 内に対応する scripts が定義されている必要があります。今回のダウンロードパッケージにはスクリプトが用意されていますが、自身で npm init -y を使って新規作成したプロジェクトにはデフォルトで含まれていません。Missing script: "build" と出た場合は、まずディレクトリを確認し、次に scripts を確認してください。直接 npx vite build に切り替えても問題ありません。

今回のソフトウェア検収はデスクトップ Chromium および 390px 幅のシミュレートされたスマートフォンを対象としており、実際の iOS、Android、WeChat、教室のプロジェクター機器でのテストは実施していません。また、実際の授業での学習効果の検証も行っていません。注意すべき点として、当初の4ラウンドの実作業では本の落下という単一の実験しか実装していませんでした。8種類のエネルギー貯蔵探究を完了した後、教材には紙面の展開や断面のクローズアップを完全なフローに組み込む発展的な追加ラウンドが施されており、コードスナップショットには各ラウンドの進化状態が残されています。


教材の拡張:元の授業の8種類のエネルギー貯蔵マッピングと今後の開発

Every Joule の第1課には、すでに8種類のエネルギー貯蔵すべてに対応するオブジェクトモデルが含まれています。元の授業では右ページに8つの発光する缶が配置されており、生徒がシーン内の具体的な物体をクリックすると、対応するエネルギー貯蔵が点灯します。簡易プロトタイプを拡張する際、これらの対象物と数値の扱いを参考にすることができます:

エネルギー貯蔵の種類(Store) 元の授業の対応物体 元の授業の現状と数値表現 今後の読者による拡張に向けた参考助言
運動エネルギー(Kinetic) 自転車に乗る人(Cyclist) 動く物体をアニメーション表示し、クリック後に運動エネルギー缶を点灯 車速と質量の公式をバインド可能:Ek = 0.5 · m · v^2
位置エネルギー(Gravitational) 棚の上の本(Book on shelf) 自由落下を実演、計算式 Ep = 1 × 9.8 × 1.5 ≈ 15 J(精密値 14.7 J) 本ガイドの第4ラウンドで実装した m, h0, g のパラメータサンドボックスを接続可能
弾性エネルギー(Elastic) 伸びたバネ(Stretched spring) 引き伸ばされたバネの形態を表現し、クリックで弾性エネルギー缶を点灯 フックの法則と弾性エネルギーの公式を関連付け可能:Ee = 0.5 · k · (Δx)^2
熱エネルギー貯蔵(Thermal) 温かい飲み物(Hot drink) カップ内の温かい飲み物をクローズアップし、選択後に熱エネルギー貯蔵とその計算根拠を表示 ΔE = m · c · Δθ で温度差に対応する内部エネルギー変化を計算可能。冷却曲線をシミュレートするには別途伝熱モデルが必要
化学エネルギー貯蔵(Chemical) 単3電池(AA Battery) 電池の断面を表示し、上限の推計値として 14,000 J を表記(容量 × 定格電圧) 14,000 J は特定の電池の推計値であり、すべての電池に共通するものではない旨を生徒に説明する必要あり
磁気エネルギー貯蔵(Magnetic) 磁石(Magnets) 磁石間のエネルギー貯蔵を定性的に表示。引用すべき典型値がないため固定のエネルギー数値を設定せず 定性的な指導を維持し、信頼できる根拠のない実測ジュール数を捏造しない
静電エネルギー貯蔵(Electrostatic) 摩擦した風船(Rubbed balloon) 帯電した風船を定性的に表示。権威ある標準データがないため具体的な数値を表記せず 定性的な表示を維持し、静電エネルギー貯蔵と電気的仕事の伝達経路の違いを生徒に区別させる
核エネルギー貯蔵(Nuclear) 太陽(Sun) 核反応によるエネルギー貯蔵を表現し、太陽の1秒間の放射出力を実演数値として採用 この数値は1秒間の放射エネルギーを表しているに過ぎず、太陽の核エネルギー総埋蔵量ではないことを生徒に明確に伝える必要あり

今回のラウンドの振り返り:単一の落下体から8種類のエネルギー貯蔵探究サイクルへ

4ラウンドの実装で本の落下と3つのエネルギーの記録が完成しましたが、元の授業のもうひとつの重要な目標である「生徒が身近な例の中から8種類のエネルギー貯蔵を識別し、8/8 をすべて見つける探究チャレンジを達成する」ことまではカバーできていませんでした。

記事の中で読者の参考に供する表を提示することと、教材そのものに対応するインタラクションを組み込むこととは同義ではありません。このインタラクションは4ラウンドの後の独立した補完として今回の教材に追加されました。読者が再現作業を行う際に追加できるよう、以下に補足プロンプトを掲載します。

今回追加実装された8つの立体エネルギー貯蔵オブジェクトと8/8の発見状態
今回の追加実装:8つの実際の3Dオブジェクトと同名のボタンが単一のマッピングを共有し、重複クリックしても発見数は増加しません。バッジは「発見済み」を示すものであり、ジュール数を表すものではありません。

リソースの境界とメディアに関する注記

  1. 外部メディアアセットを必要としないプロシージャルジオメトリ:本教材プロトタイプ内のすべての3Dモデル(本棚、本、自転車、バネ、温かい飲み物、電池、磁石、風船、太陽)は、Three.js の標準ジオメトリ(BoxGeometry、CylinderGeometry、TorusGeometry、SphereGeometry など)の組み合わせによって構築されており、EdgesGeometry の輪郭線によって線画の質感を再現しています。教材の実行にあたり、外部の GLB/OBJ モデル、テクスチャ画像、音声ファイルをダウンロードする必要は一切ありません。依存関係をインストールするだけで実行でき、コードパッケージにも再配布ライセンスのないサードパーティ製メディア素材を混入させるべきではありません。
  2. 原作素材の参考としての位置づけ:文中に引用されている原作者のスクリーンショット(lesson-desktop.png)や原作者のデモ動画(source-demo.mp4)は、デザインの対照および出典の確認のための根拠に過ぎず、今回の自作コードによる生成物ではありません。自作教材の実行スクリーンショットや録画画面には「自作教材の録画/スクリーンショット」と明確に表記すべきであり、画面の外観や操作が正常であることはソフトウェアのインタラクションが成立していることを証明するに過ぎず、教育的成果の達成と直接等しいと見なすことはできません。
  3. 高度な視覚効果と機能の境界:元の教材に見られる紙面が立ち上がる展開アニメーション、温かい飲み物のクローズアップ、電池断面のカメラワーク構成について、現在の教材は独立した自作実装を発展ラウンドとして完備しています(自前で描画した CanvasTexture の見開きベースプレート、ヒンジによる立ち上がりアニメーション、プロシージャルジオメトリの断面に基づくものであり、実際の紙の力学シミュレーションや原作コードの複製ではありません)。一方で、音声のオン/オフ、6種類の指導要領に応じたフィルタリング、残る9課のコンテンツは現時点では制作されていません。自作教材は指導と操作のサイクルを成立させることを目的としており、原作と視覚的にピクセル単位で一致していると主張するものではありません。また、操作がスムーズであることは実際の教室での教育効果と直接同義ではありません。

基礎版教材の12.2秒間のブラウザ操作サンプリング抜粋:本をクリックして落下させ、3つのエネルギーの同期を観察し、その後8種類のエネルギー貯蔵を順にクリックして 8/8 まで達成する様子。動画中の「熱・内部エネルギー」は今回新たに増加した1回分を指しており、現在の教材ラベルには「内部エネルギー増分」と明記されています。音声トラックはありません。操作画面はサンプリングおよび抜粋されたものであり、実際の教材は直接操作可能であるため、この映像からアニメーションのフレームレートを評価することはできません。

追加プロンプト:8種類のエネルギー貯蔵探究と授業内発問

読者は最初の4ラウンドのコードがすべて検収を通過した後、同一の対話セッションに以下の追加プロンプトを送信することで、教材に独立した8種類のエネルギー貯蔵探究エリアと、それに付随する授業内コンセプト発問モジュールを増設することができます。

日本語プロンプト(追加ラウンド) · 開いて表示・コピー
これまでの4ラウンドにおける本の落下および教師用ドロワーの機能が完全に正常動作することを維持した上で、index.html、style.css、main.js を引き続き更新し、教材に「8種類のエネルギー貯蔵探究エリア(8 Energy Stores Explorer)」とそれに付随する授業用コンセプト発問モジュールを追加してください。

【機能およびインタラクション仕様】
1. 8種類のエネルギー貯蔵の3Dプロシージャルモデルとデュアルエントリー操作:
   - 本棚シーンの横または下の独立した領域に、Three.js の標準ジオメトリを使用して、特徴的な8つのプロシージャル・ラインアートモデルを構築します(EdgesGeometry の輪郭線と組み合わせ、外部アセットは不要):
     * 運動エネルギー(Kinetic):単純化したサイクリストのモデル(車輪のリング、フレーム、人間、進行方向の矢印。動きの手がかりのない静止した自転車で運動エネルギーを代表させないこと)。
     * 位置エネルギー(Gravitational):高いところにある本と棚受。
     * 弾性エネルギー(Elastic):引き伸ばされたバネ構造(らせん状リングの組み合わせ)。
     * 熱・内部エネルギー(Thermal):ホットドリンクのカップモデル(カップの口から立ち上る湯気のワイヤーフレーム付き)。
     * 化学エネルギー(Chemical):単3電池(円柱にプラス極の突起)。
     * 磁気エネルギー(Magnetic):N/S 極の表記がある一対の棒磁石。
     * 静電エネルギー(Electrostatic):摩擦した風船(球体と垂れ下がる紐)。
     * 核エネルギー(Nuclear):輝く太陽のモデル(中心の球体と周囲に放射する光線)。
   - デュアルエントリーの同期応答:UI上に該当する8つのHTMLテキストボタンを用意し、キャンバス内の3Dモデルをクリックしても、HTMLボタンをクリックしても、同一のデータマッピングを参照するようにします。
   - インタラクションフィードバックと重複排除カウント:いずれかのオブジェクトをクリックすると、3Dモデルがハイライトされ、該当するエネルギー貯蔵バッジが点灯し、サイドバーにオブジェクト名、属するエネルギー貯蔵の種類、物理的解説が表示されます。JavaScript の Set コレクションを使用して探究済みのエネルギー貯蔵タイプを記録し、探究の進捗(例: 3/8 から 8/8 のチャレンジ達成まで)を表示します。すでに発見済みのオブジェクトを再度クリックしても合計数に重複カウントしないようにします。「探究進捗をリセット」ボタンを提供してください。

2. 物理的な記録の独立性と定性的表示の原則:
   - 中核原則:8種類のエネルギー貯蔵の探究は「物体がエネルギーを保持する形態を識別する」ものであり、単一の落下という物理イベントではありません。8つの事例は互いに独立しており、エネルギー同士を足し合わせることはなく、本の落下の 14.7 J の帳簿と混算したり、ひとつの疑似的な合計値にまとめたりすることは厳禁とします。
   - 数値の定性的扱い:本の落下は定量的な計算を行いますが、残る7種類の探究オブジェクトは定性的なテキストとステータスカードで説明し、疑似的に精密な共通エネルギーバーは描画しません。磁気エネルギーと静電エネルギーは信頼できる標準値がないため、「定性的表示(代表的な単一の数値なし)」と明記し、0 J と表記することは厳禁とします。太陽は核反応によってエネルギーを放出し、放射の形で外部へ伝達されることを説明し、太陽の1秒間の放射エネルギーを総核エネルギー貯蔵量として表示することは厳禁とします。原作の単3電池の 14,000 J を引用する場合は、特定の電池における上限の推定値であることを明記しなければなりません。最小バージョンでは定性的な解説にとどめ、キャリブレーションされていない動的エネルギー缶を無理に詰め込まないでください。

3. エネルギー伝達経路(Pathways)の明確な明記:
   - 物理解説カードの中で、エネルギー移動が依存する4つの経路(Pathways)を明確に示します:
     * 落下する本:力と変位による「力学的仕事(Mechanical work)」
     * 電池からの給電:化学エネルギーが回路内の「電気的仕事(Electrical work)」を通じて電気器具を駆動
     * ホットドリンクの冷却:カップと環境の温度差により、「熱移動(Heating)」を通じて熱・内部エネルギーが周囲の媒体へ移行
     * 太陽放射:核融合がエネルギーを放出し、電磁波の「放射(Radiation)」を通じて宇宙空間へ伝達
   - UI上の目立つテキストで「『光』や『電流』はエネルギーの伝達経路であり、孤立したエネルギー貯蔵缶ではない」と強調し、生徒の混同を防ぎます。

4. 教師用準備ビューの内容拡充:
   - 既存の Teachers' Notes ドロワーに目標、用語、指導上の留意点を追加し、応用発展問題を教材の視認可能な領域に配置します:
     * 学習目標(Learning Objectives):8種類のエネルギー貯蔵を識別し、生活の中の例を挙げること。本の落下過程におけるエネルギー変換を記述すること。4つの伝達経路を区別すること。「エネルギー缶は帳簿のメタファーであり、エネルギーは流体ではない」ことを理解すること。
     * 中核用語の定義カード:系/システム(System)、エネルギー貯蔵(Energy store)、伝達経路(Pathway)、ジュール(Joule)。
     * 指導要領と学習者の想定:原作の 14〜16 歳の学習者を設計の参考とし、必要な質量・高さ・掛け算の前提知識を説明します。中国の特定の教科書に準拠していると主張してはなりません。
     * 新たな状況への応用発展問題と遅延表示:「授業での問いかけ(Questions to Ask)」モジュールを追加し、次の思考問題を含めます:「ぜんまいを巻いたおもちゃの車は、走らせる前にはどんなエネルギーを蓄えているでしょうか? おもちゃが止まった後、そのエネルギーは最終的にどこへ行ったでしょうか?」
       「解説を表示」折りたたみボタンを用意し、クリックで模範解答を展開できるようにします(ぜんまいを巻くことで弾性エネルギーが蓄えられ、解放後は力学的仕事を通じて運動エネルギーに変換され、摩擦抵抗と衝突によって最終的に車・床・空気の熱・内部エネルギーとして散逸する)。
   - 探究の進捗は現在のブラウザセッション内でのみ一時的に記録し、いつでもワンクリックでリセットできるようにします。教師に対して「生徒が 8/8 をすべてクリックしたことは操作を完了したことを示すのみであり、物理概念が内面化され習得されたことを直接証明するものではない」と明確に注記してください。

完全な修正コード、または main.js、index.html、style.css に対する差分パッチを出力してください。必要に応じて physics.js、stores.js、exploration.js に分割し、明確なモジュールインポートを保持してください。修正後はこれまでの4ラウンドの主要な状態を再検証してください。
English Prompt (Supplementary Round) · 英語原文を表示・コピー
Keeping all functionality from Rounds 1 to 4 (book drop physics, 3D controls, line-art styling, and Teachers' Notes drawer) fully operational, update index.html, style.css, and main.js to add a dedicated "8 Energy Stores Explorer" and classroom pedagogy questions.

[Requirements]
1. 8 Procedural 3D Models & Dual Input:
   - In a distinct section of the scene, generate 8 identifiable procedural line-art 3D objects using native Three.js geometries and EdgesGeometry (zero external asset files):
     * Kinetic: Moving cyclist (wheel rings, frame and rider, with a direction arrow);
     * Gravitational: Elevated book on shelf;
     * Elastic: Stretched spring structure;
     * Thermal: Hot drink mug with steam wireframe;
     * Chemical: AA battery (cylinder with positive terminal nipple);
     * Magnetic: Pair of bar magnets with polarity markers;
     * Electrostatic: Charged balloon with dangling string;
     * Nuclear: Sun sphere with radiating beams.
   - Dual-input accessibility: Provide 8 corresponding HTML buttons. Clicking either the 3D mesh via Raycaster or clicking its HTML button triggers the identical store data mapping.
   - Feedback & Deduplication: Clicking highlights the object, lights up the corresponding store badge, and reveals its name and explanation. Track discovery progress using a JavaScript Set (e.g., 3/8 up to 8/8 challenge complete). Repeated clicks on discovered objects must not increment the counter. Provide a "Reset Discovery" button.

2. Ledger Independence & Qualitative Display:
   - Core rule: The 8-store explorer is for identifying store types across separate everyday objects, NOT a single falling event. The 8 stores do not sum together and must NEVER be mixed with the falling book's 14.7 J ledger.
   - Qualitative representations: Use qualitative text cards without arbitrary common scale bars. Magnetic and electrostatic stores must be labeled as "Qualitative (no typical single value)", never as 0 J. The sun card explains nuclear fusion released via radiation without claiming 1-second radiation output as total nuclear inventory. If quoting the original battery example of 14,000 J, identify it as an upper estimate for a specified battery. The minimum explorer may remain qualitative.

3. Explicit Pathways Recognition:
   - Detail the 4 transfer pathways in the explanation panels:
     * Falling book: Mechanical work done by gravitational force;
     * Battery: Chemical store transfers via electrical work through currents;
     * Hot drink: Heat transferred to surroundings via heating due to temperature difference;
     * Sun: Nuclear energy transferred outward via electromagnetic radiation.
   - Note explicitly: Light and electric currents are transfer pathways, not energy stores.

4. Teachers' Notes Enrichment:
   - Append to the Teachers' Notes drawer:
     * Learning objectives, key vocabulary (System, Store, Pathway, Joule), and 14–16 age reference and prerequisites; do not claim alignment with a particular Chinese curriculum.
     * New transfer question: "Which store does a wound-up toy hold before release, and where has that energy gone once it stops?" Include a delayed-reveal toggle explaining the transfer from elastic store -> kinetic -> dissipated into thermal stores of surroundings.
     * Clarify that explorer progress is session-only, resettable, and that completing 8/8 interactions does not constitute proof of conceptual mastery.

Output the complete code or clean incremental updates across main.js, index.html, and style.css. You may extract physics.js, stores.js and exploration.js as needed; rerun the earlier acceptance checks.
追加ラウンドの検収ポイント
  1. デュアルエントリーの一致性:キャンバス内で3Dの風船をクリックしても、下部の「摩擦した風船」HTMLボタンをクリックしても、そのオブジェクトが正しくハイライトされ、該当する解説が展開されること。
  2. 重複排除カウントの検証:8つの異なるオブジェクトを順にクリックすると、探究進捗カウンターが 1/8 から 8/8 へと1つずつ増加し、全点灯のチャレンジフィードバックが発火すること。すでに点灯した物体を再度クリックした際、解説パネルは正常に切り替わるもののカウントは増加しないこと。
  3. 帳簿の独立性の検証:8種類のエネルギー貯蔵内のいずれの物体をクリックしても、本の落下エリアの全エネルギー(14.70 J またはカスタムパラメータ値)および3つのエネルギー缶は一切の数値的影響を受けず、両者の状態が互いに独立していること。
  4. 経路と問いかけの展開:物理解説テキストの中に力学的仕事、電気的仕事、熱移動、放射の4つの経路が明確に列挙され、光と電流は貯蔵ではないことが強調されていること。教材内でぜんまい仕掛けのおもちゃの思考問題の解説をスムーズに展開でき、リセットボタンで探究記録をクリアできること。

発展的な接続:見せ場となる視覚効果を完全な教育プロセスへ組み込む方法

8種類のエネルギー貯蔵探究を完了した時点で、教材は分類識別の機能を備えました。しかし、原作が持つ「飛び出す絵本が立ち上がり、カメラが観察を誘導し、その後に自らの手による操作へ移行する」という完全な授業リズムを再現するためには、紙面の展開、温かい飲み物のクローズアップ、電池断面のカメラワークをスムーズにシステムへ組み直す必要があります。

エンジニアリングの観点からカメラワークの実演をインタラクティブ教材に組み込む際、最も避けるべきは「視覚的なデモ」と「物理的な帳簿記録」を混同してスパゲッティ状態にすることです。状態管理のレイヤーにおいて、完全に異なる4つの状態を厳密に分離しなければなりません:

  1. 紙面展開状態(Unfold Progress, 0.0–1.0):見開きベースプレート上で立体モデルがヒンジによって立ち上がるプロセスを制御します。これは教材のステージを展開する幾何学的な補間アニメーションであり、この間、本は本棚の上で静止しています。これを物理時間や落下の進捗と混同することは厳禁です。
  2. 電池断面状態(Cutaway Progress, 0.0–1.0):電池の外殻が開くヒンジ角度と、内部の層状コアの露出度合いを制御します。この状態は電池を観察しているときのみ有効であり、クローズアップを抜けるか全体表示に戻る際は必ず強制的に閉じた状態へリセットしなければなりません。他のモデルへ漏れ出したり、グローバルなエネルギー数値と混算することは厳禁です。
  3. 本の物理記録状態(Falling Physics State):単一の導出関数 computePhysicsState(progress, m, g, h0) のみによって駆動されます。本棚と地面の間における本の力学的エネルギー保存(14.70 J など)と、衝突着地後の内部エネルギー増分は厳密に自律整合します。温かい飲み物の熱エネルギーや電池の化学エネルギーは独立した定性的な日常の事例であり、これらを本の 14.7 J の帳簿に加算したり混入させることは厳禁です。同時に、カメラワーク内で実演される本の落下は、手動の落下スライダーと同一の物理関数および現在の教師用パラメータを共有し、画面上の数値がどこを見ても完全に一致していることを保証しなければなりません。
  4. 生徒の認知・探究状態(Pedagogy & Interaction State):着地後のエネルギーの行き先に関する生徒の最初の予測選択(A/B/C)、点灯済みのエネルギー貯蔵セット(Set 0/8〜8/8)、Why 紙片の閲覧フラグ、およびエクスポートされる JSON 記録を含みます。5カットのカメラワークを観ることは受動的な観察(Watch)であり、新しいページを開いた状態から実演を見終えた時点での発見数は 0/8 を維持すべきであり、すでにある発見数も実演によって増えたりクリアされたりしてはなりません。アニメーションの再生によって発見数が自動的に増加することは厳禁であり、必ず生徒自らが物体をクリックして探究した場合にのみ点灯します。同時に、教師がパラメータを調整したり、実演を終了したり、カメラワークを再再生した際も、生徒がすでに行った最初の予測選択や回答をクリアしてはなりません。
今回新たに追加された効果の実際のブラウザサンプリング:紙面の線画が立ち上がり、ホットドリンクの飲み口がクローズアップされ、電池の殻が開き、本が落下して全体表示に戻る様子。動画は約17.8秒、5カット自体は15.5秒です。視聴が終了した時点でも 0/8 のままであり、発見チャレンジには別途自分自身で操作を行う必要があります。
自作の飛び出す絵本の中で電池の外殻が開き、単純化された層状のコアと中心棒が表示されている様子
今回の電池断面クローズアップ。外殻、層状コア、中心棒はプロシージャルジオメトリによる教育用の概念図であり、実際の単3電池の素材や比率に沿ってモデリングされたものではありません。

発展追加プロンプト:飛び出す絵本の展開と断面カメラワーク

読者は最初の4ラウンドおよび8種類の探究ラウンドがすべて検収を通過して利用可能になった後、同一の対話セッションに以下の発展プロンプトを送信することができます。

日本語プロンプト(発展追加ラウンド) · 開いて表示・コピー
これまでの4ラウンドの物理コア、教師用ドロワー、および8種類のエネルギー貯蔵探究機能が完全に正常動作することを維持した上で、シーンアーキテクチャをリファクタリングおよびアップグレードし、「飛び出す絵本の展開、ホットドリンクのクローズアップ、電池断面のカメラワーク」を完全な「予測—実演—操作—解説—チャレンジ」という指導サイクルにシームレスに組み込んでください。

【アーキテクチャのリファクタリングとモデルの再利用】
1. プロシージャルモデルファクトリの抽出(store-models.js):
   - 既存の8つのプロシージャルジオメトリ生成関数を独立したモジュール store-models.js に抽出し、探究エリアとデモシーンで基本モデルを共有できるようにします。カップの飲み口、電池の開閉、動的な本などは基本モデル上で拡張し、外部の GLB モデル、テクスチャ画像、音声ファイルの導入は厳禁とします。
   - ホットドリンクモデル:中空円柱のカップ本体、液面、取っ手、およびカップ上部に時間とともに揺らめきながら上昇する3本の黒い線(湯気を模したもの)。一時停止時は湯気の揺らめきの位相が完全に静止しなければなりません。静止モードでは静止状態を保ちます。定性的な概念図に過ぎず、分子の粒子動力学シミュレーションは行わず、液体の断面もないことを明記してください。
   - 電池モデル:円柱の外殻にヒンジで開く断面機構を追加し、展開時に単純化された層状のコアと中心棒が露出し、0〜100% の断面スライダーを提供します。定性的な構造の概念図であり、実際の単3電池の比率ではなく、亜鉛やマンガンなどの具体的な化学物質を表記することは厳禁、発光マテリアルを実体のある「電気エネルギーの流れ」と説明することは厳禁である旨を明記してください。
2. 飛び出す絵本の見開きベースプレート(guided-scene.js):
   - Three.js を使用して2ページの見開きベースプレートを構築し、動的に描画した CanvasTexture を使用して手描きの印刷文字と白黒線画の質感を表現します(print→peel→shade→live のプロセスを模倣)。
   - 8つのモデルは最初右ページ上に線画の平面として配置され、起き上がり進捗(0〜100%)に伴ってヒンジ回転により徐々に3次元の立体モデルへと立ち上がります。手動の起き上がりスライダーを提供し、「完全な実演を再生」をクリックすると自動的に滑らかに展開するようにします。prefers-reduced-motion または静止モードでは、0% と 100% の静止形態を直接比較できるようにします。これは幾何学的な補間アニメーションであり、実際の紙の力学的な変形シミュレーションではないことを明記してください。

【5カットのカメラワークシステムと状態管理(guided-state.js)】
1. カットのメタデータとタイムライン構成:
   - 連続する5つのカメラワーク段階を設定し、合計時間を 15.5 秒とします:
     * Shot 1(3.0秒):全景の俯瞰、飛び出す絵本の見開き展開とモデルの立ち上がり。
     * Shot 2(4.0秒):カメラがホットドリンクのカップ口へスムーズに寄り、揺らめく3本の湯気と熱エネルギー貯蔵を表示。
     * Shot 3(4.0秒):カメラが電池に向かい、外殻がヒンジで開いて断面が現れ、内部の化学エネルギー貯蔵構造を表示。
     * Shot 4(3.0秒):本棚のローアングル側面視点に切り替わり、電池の外殻は自動で閉じ、本が棚から落下して地面に衝突。
     * Shot 5(1.5秒):カメラが全景のオーバービューへ戻り、自由な操作状態に移行。
2. 再生制御とアクセシブルな操作部:
   - 実際に視認できるHTMLのカメラ制御パネルを提供:「再生/一時停止/再開」「最初から再生」「前のカット」「次のカット」、5つのカットへの直接ジャンプボタン群、および「実演を終了して全体へ戻る」ボタン。
   - デュアルエントリーのインタラクション:制御パネルをクリックするだけでなく、全体表示モードで3Dシーン内のホットドリンク、電池、または高い位置の本を直接クリックすることでも、対応するクローズアップのカメラワークへスムーズに遷移できるようにします。
3. 状態のクリーンアップとライフサイクルの分離:
   - キーボードの Space キーは現在実行中のカメラワークの再生/一時停止を優先して制御します。カメラワークの実行中にスペースキーによって本の落下が誤ってトリガーされることは絶対に防いでください。
   - ページからの離脱(visibilitychange)や教師用準備ドロワーを開いた際は、現在のカメラワークを直ちに自動一時停止します。一時停止時はカメラの補間、断面の展開、湯気の揺らめき、物理的な落下をすべて同時に静止させます。
   - 教師がドロワー内で物理パラメータ(m, h0, g)を変更した場合は、強制的に全体表示の初期状態へリセットします。
   - 実演を終了するか電池のカットから離脱した際は、電池の外殻が必ず閉じた状態に復帰し、断面が開いたままの残像を残さないようにします。

【物理コアの共有とデータの分離】
1. 単一の落下物理コア:
   - デモの第4カットにおける本の落下は、共通の computePhysicsState(progress, m, g, h0) を直接呼び出し、右側の手動探究エリアと現在の質量、高さ、重力パラメータを厳格に共有しなければなりません。手動モードで本の落下スライダーを操作した際、飛び出す絵本の中の本のメッシュの高さと左側の 14.7 J の帳簿が完全に同期するようにします。
   - ホットドリンクと電池は独立した定性的な日常の事例であり、その推定値を本の落下の 14.7 J の帳簿に合算したり混入させたりすることは厳禁とします。
2. 認知データの保護と JSON エクスポート:
   - デモエリアでホットドリンク、電池、本をクリックした場合はクローズアップの切り替えのみを行い、発見数にはカウントしません。8種類の探究エリアのモデルと同名ボタンのみが発見セットを変更します。5カットのカメラワーク実演の視聴は受動的な観察(Watch)であり、新しいページから視聴を開始した場合、全編および終了後の探究進捗は 0/8 を維持しなければなりません。すでに探究記録がある場合も元のカウントを保持し、増やしたりクリアしたりせず、アニメーションの再生によって自動的に生徒の発見カウントを増やすことは厳禁とします。生徒自身が手動で3Dキャンバスまたはボタンで探究オブジェクトをクリックしたときのみ、カウンターが増加します。
   - パラメータ調整、実演の終了、またはカメラワークの再再生時に、授業前に生徒が選択した予測選択肢(A/B/C)や回答をクリアすることは絶対に避けてください。Why が閲覧された履歴フラグも保持しますが、落下を再開する際は解説を折りたたんで閉じ、古い最終状態の解説が現在の画面と矛盾しないようにします。
   - 状態エクスポートの改善:「学習記録をエクスポート」ボタンを提供し、まず視認できる「今回のJSONをダウンロード」リンクを生成し、ダウンロードが制限されている環境での読み取り用として展開可能な読み取り専用 JSON を提供します。成功アラートを表示するだけで終わらせてはなりません。記録には prediction、exploration.found(発見済みセット)、guided(現在のカット、展開進捗、断面進捗、完了フラグ)、whyViewed、transferReferenceViewed の JSON データを含めます。エクスポートの説明には「8/8の探究および実演の完了は操作が行われたことのみを示し、実際の学習効果の証明にはならない」旨を教師に向けて明確に注記してください。
English Prompt (Advanced Supplementary Round) · 英語原文を表示・コピー
Keeping all physics logic, Teachers' Notes drawer, and 8-store explorer features fully functional, refactor the application architecture to integrate papercraft unfolding and cinematic close-ups (hot drink and battery cutaway) into the complete "Predict-Watch-Try-Explain-Challenge" pedagogical flow.

[Architecture Refactoring & Procedural Models]
1. Procedural Model Factory Extraction (store-models.js):
   - Extract the 8 procedural line-art geometries into a modular store-models.js factory shared across both the explorer and cinematic scene. Do NOT load external GLB/OBJ models, image textures, or audio assets.
   - Hot Drink: Hollow mug cylinder, liquid surface, handle, and 3 rising procedural ink lines for steam waving over time. When paused, steam animation phase must freeze completely; remain static in reduced-motion mode. Treat strictly as a qualitative everyday example without molecular particle simulation or liquid cross-section.
   - Battery: Cylindrical casing with a hinged cutaway displaying simplified layered core and central rod, controlled by a 0–100% cutaway slider. Explicitly label as a qualitative diagram: not to scale, no zinc/manganese material labels, and never depict emissive glows as physical energy fluids.
2. Unfolding Papercraft Stage (guided-scene.js):
   - Build a Three.js pop-up book spread using programmatic CanvasTexture for printed text and ink linework (reflecting the print -> peel -> shade -> live sequence).
   - 8 models start flattened as flat linework on the page and pivot upwards on hinges as unfolding progresses (0–100%). Provide a manual unfold slider alongside smooth unfolding after the user starts the demo; under prefers-reduced-motion, allow comparing 0% and 100% static states. Clarify that this is keyframe tweening, not continuum paper elasticity simulation.

[5-Shot Cinematic System & State Management (guided-state.js)]
1. Shot Metadata & Choreography:
   - Implement 5 sequential shots totaling 15.5 seconds:
     * Shot 1 (3.0 s): Overview bird's-eye view, book spread unfolding and models erecting;
     * Shot 2 (4.0 s): Camera pushes in to hot drink mug, revealing 3 oscillating steam lines and thermal store;
     * Shot 3 (4.0 s): Camera pans to battery, casing hinges open to reveal cutaway and chemical store;
     * Shot 4 (3.0 s): Low-angle view of the bookshelf, battery closes, book drops and hits the ground;
     * Shot 5 (1.5 s): Camera pulls back smoothly to full overview for free exploration.
2. Accessible Playback Controls:
   - Provide visible HTML controls: Play/Pause/Resume, Replay, Prev Shot, Next Shot, five-shot button group, and "Exit Demo to Overview".
   - Dual input: In overview mode, clicking the 3D hot drink, battery, or shelf book directly transitions camera framing to that close-up shot.
3. State Isolation & Lifecycle Cleanup:
   - Global Spacebar toggles demo play/pause during cinematic mode without falsely triggering book drop.
   - Switching browser tabs (visibilitychange) or opening the Teachers' Notes drawer must pause playback immediately; pausing freezes camera interpolation, cutaway extension, steam wave phase, and physics.
   - Adjusting teacher parameters (m, h0, g) immediately resets the cinematic scene to initial state.
   - Exiting the demo or switching away from the battery shot must close the battery cutaway casing.

[Physics Engine Sharing & Data Isolation]
1. Unified Physics Derivation:
   - Shot 4 falling animation must directly invoke the shared computePhysicsState(progress, m, g, h0), synchronized with active teacher parameters; dragging the manual fall slider updates the pop-up book mesh and 14.7 J ledger in lockstep.
   - Qualitative stores (hot drink and battery) are strictly isolated; their values (e.g. battery 14,000 J estimate) must NEVER contaminate or sum into the falling book's 14.7 J ledger.
2. Learning State Integrity & JSON Export:
   - Clicks in the cinematic scene change the close-up only; discoveries are counted only in the dedicated8-store explorer. Watching the demo is an observation phase: a fresh page remains at 0/8 after demo completion; existing discoveries must neither increase nor be erased. Never increment the found counter from passive viewing; only direct user clicks on 3D meshes or HTML buttons count.
   - Changing parameters, exiting, or replaying the demo must NEVER erase student's initial predict choice (A/B/C) or transfer answer; preserve a separate Why-viewed history flag even if the explanation is folded again for a new fall.
   - Implement "Export Learning Log" by creating a visible download link plus a read-only JSON preview for fallback; do not merely show a success toast. The payload contains prediction, exploration.found array, guided (shot, unfold, cutaway, completed), whyViewed and transferReferenceViewed. Add an explicit disclaimer that 8/8 completion is an interaction log, not evidence of conceptual mastery.
発展ラウンドの検収ポイント
  1. モデルの共有と独立レンダリング:store-models.js が探究エリアと飛び出す絵本シーンの双方に正常にジオメトリを提供し、プロジェクトのネットワークパネルに .glb や画像テクスチャのリクエストが一切発生しないこと。
  2. カメラワークとフリーズの一貫性:実演の再生中にスペースキーを押すかタブを切り替えた際、カメラの前進、湯気の揺らめき、電池断面の展開、本の落下がすべて同時に停止し、再開後はスムーズにつながること。
  3. 実演終了時の状態復帰:電池のクローズアップ段階で「実演を終了」をクリックすると、電池の外殻が自動で閉じ、カメラがパノラマ全体表示へスムーズに戻り、モデルの破綻が残らないこと。
  4. 記録と発見の分離:実演の再生が終了した後も、発見進捗が 0/8 を維持していること。本の 14.7 J の帳簿が温かい飲み物や電池の数値による影響を受けていないこと。

試用検収:全プロセスの通しテストと教育的観察

教材にすべての機能が組み込まれた後、読者や同僚の教員とともに完全な教育アクションのサイクルに沿って通しテストを実施することをお勧めします。このテスト手順は、ソフトウェアのインタラクションと物理状態の整合性を検証するためのものです。以下に読者が操作可能な確認手順、期待される表示値、およびよくある異常の修正法を記録します。ソフトウェアの操作ログと、実際の生徒による教室での理解度とは、明確に区別して判断する必要があります:

読者が操作可能な完全なテスト手順

  1. ステップ1:素朴概念の予測(Predict)

    • 操作手順:初期画面に入り、実演や落下をクリックしない。直接左ページの予測カードで素朴概念の選択肢を1つ選ぶ(例: A「完全に使い果たされた」)。
    • 期待される現象と表示値:ラジオボタンが選択され、カードは静止した状態を保つ。「Why? 判定」の折りたたみ紙片は隠れた状態を保ち、UI上に選択肢の正誤が事前に表示されることは一切ない。右側の8種類のエネルギー貯蔵の進捗は 0/8 を維持する。
    • 異常の切り分けと修正:選択直後に正誤が表示されたり自動で解説が開く場合は、イベントコールバックに判定ロジックが混入しています。ラジオボタンのリスナーを確認し、判定を本が着地して手動で開いたときまで厳格に遅延させてください。
  2. ステップ2:5カットのカメラワークの通し確認(Watch)

    • 操作手順:「播放完整演示」(全編を再生)または「从头播放」(最初から再生)をクリックし、Shot 1 から Shot 5(合計15.5秒)を順に体験する。Shot 2(温かい飲み物)でスペースキーを押して一時停止し、Shot 3(電池)で断面スライダーを手動でドラッグし、その後「继续演示」(デモを再開)をクリックして、カメラワークが終了して全体表示に戻るまで見届ける。
    • 期待される現象と表示値:
      • Shot 1(3.0秒):見開きベースプレート上の平らな線画が立体幾何モデルへと立ち上がる。
      • Shot 2(4.0秒):カメラがホットドリンクの飲み口へ寄り、3本の黒い線が揺らめく。スペースキーで一時停止した際、カメラの接近が止まり、湯気の揺らめきの位相が完全に静止する。再度スペースキーを押すと滑らかに再開する。
      • Shot 3(4.0秒):カメラが電池を捉え、外殻がヒンジで開いて層状コアと中心棒が露出する。
      • Shot 4(3.0秒):ローアングルの側面視点に切り替わり、電池の外殻は自動で閉じる。本が加速落下し、位置エネルギーの柱が 14.70 J から空になって運動エネルギーへ流れ込み、衝突の瞬間に運動エネルギーはゼロになり、内部エネルギー増分が 14.70 J になる。
      • Shot 5(1.5秒):カメラが滑らかに全体表示の視点へと戻る。
      • 中核となる検証点:15.5秒の実演を完全に見終えた後、右ページの8種類のエネルギー貯蔵発見カウンターは厳格に 0/8 を維持していなければならない。
    • 異常の切り分けと修正:
      • 一時停止しても湯気が揺らめき続ける場合:アニメーションループを確認し、一時停止フラグが true のときは時間増分 dt を 0 にリセットして、シェーダーや頂点オフセットの更新を防いでください。
      • 実演終了後も電池の外殻が開いたままになる場合:カットの切り替えおよび終了フックを確認し、断面リセット関数(断面の角度を 0 に戻す)が呼び出されているか確かめてください。
      • 実演を見終えたら発見数が 3/8 になっていた場合:カメラワークの切り替えロジックを確認し、カメラが物体に向かう動作を探究のクリックイベントとして誤配信していないか確認してください。selectStore はユーザー自身のアクティブなクリックによってのみトリガーされるように制限すべきです。
  3. ステップ3:手動操作と動的パラメータ調整(Try & Parameters)

    • 操作手順:全体表示に戻った後、本の落下スライダーを手動で 50% の位置までドラッグする。続いて右上の「教师说明」(教師向け説明)をクリックし、パラメータを大きめの値 m = 2.0 kg, h0 = 2.0 m, g = 10 N/kg に変更し、Esc キーでドロワーを閉じる。
    • 期待される現象と表示値:
      • デフォルトパラメータ(m=1.0, h0=1.5, g=9.8)の中間地点(progress = 0.5)において、本の底面の物理的高さが正確に y = 0.75 m と表示され、エネルギー缶には Ep = 7.35 J、Ek = 7.35 J、Eth = 0.00 J と表示され、3つの合計が整合して 14.70 J に等しくなる。飛び出す絵本の中の本と右側の落下モデルの高さが完全に同期する。
      • 大きなパラメータに変更した後、シーンは自動的に初期状態にリセットされ、全エネルギーは total = 2.0 × 10 × 2.0 = 40.00 J と再計算される。再度中間地点(progress = 0.5)までドラッグすると、数値は正確に y = 1.00 m、Ep = 20.00 J、Ek = 20.00 J、Eth = 0.00 J となる。
      • 中核となる検証点:ドロワーを開く、スライダーを動かす、あるいはドロワーを閉じる動作を行っても、ステップ1で生徒が選択した予測の選択肢(例: A)は完全に保持され、不意にクリアされることはない。
    • 異常の切り分けと修正:デフォルトの中間地点が 7.35 J + 7.35 J にならない場合は、スライダーが移動距離の正確に 50% になっているか、時間の割合を誤用していないかを確認してください。物理状態から統一して導出し、表示時にのみ小数点第2位まで丸めるようにし、数値を手動で書き換えて保存則に辻褄を合わせるようなことは避けてください。パラメータ変更時に生徒の予測状態が消えてしまう場合は、パラメータ更新関数を確認し、物理の進捗と現在のカメラワークのみをリセットし、予測、発見セット、回答はリセットしないようにしてください。
  4. ステップ4:紙片をめくって解説を比較照合(Explain)

    • 操作手順:まず本の落下スライダーを 100% まで進めるか、本を落として着地を待ち、その後「为什么?翻开解析」(なぜ? 解説を開く)をクリックする。前ステップの大きなパラメータを引き継ぎ、このときは 40.00 J の内部エネルギー増分が表示されている必要がある。
    • 期待される現象と表示値:紙片が展開し、原理の解説と生徒の最初の選択「あなたの予測:A」が並んで表示される。解説では落下による仕事と、衝突によって環境の熱エネルギーへと散逸する物理プロセスが詳細に示され、Aの選択肢に対して「エネルギーは跡形もなく消え去るのではなく、周囲の利用しにくい内部エネルギーへと散逸した」旨が説明される。
    • 異常の切り分けと修正:展開後に生徒の最初の選択肢が表示されない場合は、レンダリングテンプレートが現在の prediction を正しく読み取り、prediction-comparison ノードを更新しているか確認してください。
  5. ステップ5:8種類のエネルギー貯蔵探究チャレンジ(Challenge)

    • 操作手順:下部の8種類の探究エリアでモデルまたは対応する8つのHTMLボタンを順次クリックし、8種類のエネルギー貯蔵をすべて見つける。同一のオブジェクト(例: 温かい飲み物)を連続して3回クリックする。
    • 期待される現象と表示値:新しいオブジェクトをクリックするたびに、探究カウンターが 1/8 から 8/8 へと増加し、すべて揃うと8つのバッジが点灯して完了のフィードバックが表示される。すでに探究済みのオブジェクトを繰り返しクリックした際は、解説パネルは正常に切り替わるもののカウンターは変化しない。この手順では大きなパラメータを引き継いでいるため、本の落下エリアの 40.00 J の帳簿には影響を与えない。
    • 異常の切り分けと修正:重複クリックによってカウントが増加してしまう場合は、重複排除用の Set コレクションが機能しているか確認してください(foundSet.add(storeKey) を使用し、foundSet.size を発見数として扱い、総数 8 は固定とします)。
  6. ステップ6:新たな状況への概念応用発問(Transfer)

    • 操作手順:ページ下部にあるぜんまい仕掛けのおもちゃの問題を読み、まず「我的解释」(自分の説明)にエネルギーの行き先を自力で記述し、その後「写好后,展开参考思路」(書き終えたら参考の考え方を開く)を開いて比較する。
    • 期待される現象と表示値:解説が正常に展開し、「ぜんまいの弾性エネルギー → 力学的仕事による運動エネルギーの駆動 → 抵抗と地面との衝突によって車・床・空気の熱エネルギー貯蔵へと変換される」というエネルギーの流れの連鎖が明瞭に示される。
  7. ステップ7:学習記録のエクスポートと読み戻し(Export)

    • 操作手順:「导出学习记录」(学習記録を書き出す)をクリックし、現れた「下载本次 JSON」(今回のJSONをダウンロード)をクリックする。組み込みブラウザなどでファイルが保存されない場合は、「查看本次学习记录 JSON」(今回の学習記録JSONを表示)を展開して読み戻し、コピーして保存する。
    • 期待される現象と表示値:JSON データ形式は完全であり、prediction: "A"、exploration.found: [...](8種類のキー名を含む)、および今回新たに追加された guided 構造(shot 文字列のカットID、unfold と cutaway の 0–1 の比率、および completed の現在の完了フラグを含む)が確認できる。同時に whyViewed、transferReferenceViewed、transferAnswer を照合する。guided.completed は現在のカメラワークの状態を表しており、パラメータ変更や終了によって false にリセットされます。「過去に一度でも完全に見終えたことがあるか」という累積実績ではありません。記録には次の注記が付記されている:「注意:8/8のクリックとカメラワークの完了は操作が行われたことのみを示し、物理概念を理解したことの十分な証明にはなりません」。
    • 異常の切り分けと修正:エクスポートされた exploration.found が空の配列になっている場合は、シリアライズの前に Set を正しく Array.from(set) に変換しているか確認してください。

今回の検証では、Codex が上記の全工程を実際に通過しました。Aを選択した後に5カットの実演を最後まで再生しても発見数は 0/8 のままであり、手動のデフォルト中間地点は 7.35 J + 7.35 J、2 kg、2 m、10 N/kg に変更した後は中間地点の両方の読み取り値が 20 J + 20 J となり、着地時は 40 J の内部エネルギー増分となりました。その後 Why を開き、8/8 をすべて揃え、ぜんまい仕掛けのおもちゃの解説を自力で記入した後に参考の考え方を展開し、JSON をダウンロードしました。読み戻した予測、8つの発見キー、40 J、記述内容、および2つの閲覧フラグはページの内容と完全に一致しました。

トラブルシューティングとテストの過程で、操作と読み戻しに関する問題が修正されました。クローズアップを抜けた後にスペースキーの操作権限が落下の実験に戻らない問題、一時停止時に湯気の位相が初期値に戻ってしまう問題、手動の断面比率が一時停止の更新時に跳ね戻る問題、ダウンロードボタンを押しても保存要求が出るだけで新規ファイルが確認できない問題などが挙げられます。現行バージョンでは、明確なモード終了処理、フリーズ可能な湯気時間、明示的なダウンロードリンクを採用し、JSON の読み戻しエリアも提供されています。guided.completed は現在の状態であり、パラメータ変更後に false にリセットされますが、これは生徒が実演を観ていないことを意味するものではありません。

教室環境における教育的観察の視点

この通しテストは、ソフトウェアが想定通りに動作するかを確認するためのものです。教材を正式に授業に導入する際、教師は対面での観察を通じて生徒の実際の学習状態を評価する必要があります:

  1. 予測段階における行動の観察:生徒がページに入った後、まず予測問題を読んで思考しているか、それとも実演ボタンを探して予測をスキップしているかを記録します。生徒が予測をスキップした場合、単に集中力が途切れていると決めつけるのではなく、問題文の表現が曖昧だったり、画面の階層構造が邪魔をしていたり、モバイル端末でのクリック領域が狭すぎたりした可能性も考えられます。テスト後に簡単な聞き取りを行って原因を突き止めてください。
  2. 落下中における視線の移動の観察:本が落下する過程において、生徒の注意が3Dの直方体の移動だけに向けられているか、それともエネルギー缶の棒グラフや数値の増減にも気づいているかを観察します。生徒がエネルギー数値の変動にまったく気づいていない場合は、エネルギー柱の高さの昇降に注目するよう促すことができます。
  3. 着地後における概念の言語化と応用の観察:本が落下して静止した後、生徒に問いかけます:「本がもともと持っていた 14.7 ジュール(元の授業の表示では約 15 ジュール)は今どこへ行っただろうか?」生徒自身の言葉で力学的エネルギーが環境の内部エネルギーへと散逸していく過程を説明させます。続いてぜんまい仕掛けのおもちゃの問題を用いて発問を行い、「系による仕事と最終状態の散逸」という帳簿モデルを新しい状況へ応用できるかを観察します。このような口頭での言語化は形成的評価として活用できますが、操作レベルで 8/8 を揃えたことを物理概念が真に内面化されたことと短絡的に同一視することは厳に慎むべきです。
出典
Every Joule · 3D energy book — Lesson 1Techartist·原文を見る
編集部注
本ガイドのプロンプトは独自の教育プロトタイプ向けに作成されたものであり、原作者のオリジナルのプロンプトではありません。
↑ 本文ここまで
✓ この記事は全文無料です

メンバーは全文 Markdown のコピー・保存に加え、自分の AI に購読・質問させることができます。

原文を読む ↗
📮 新着解説を毎晩メールで

役に立ちましたか?メールを登録すると、その日の新着解説を毎晩1通でお届けします。解除はいつでも。