2025年6月25日 星期三

意外事件預測與模擬:校園意外的 Three.js 模擬與提示方法

這篇整理 2025 年 6 月用 Claude 做的一組校園意外模擬。起點是兩張照片:Claude 依照片用 Three.js 寫出可以在瀏覽器裡操作的 3D 場景,先是水景廣場,再是校園。校園裡有路人走動,按下按鈕就會上演樓梯跌落、腳踏車衝撞、高處墜物等意外。對話中一共產生 36 個版本,其中兩個公開在網路上。下面先介紹這兩個版本,再整理對話經過、把兩個版本實際執行一遍的結果,以及從中歸納的提示方法。

  • 兩個版本。兩版共用同一個校園場景與三個情境(樓梯跌落、腳踏車、墜落物)。A 版另有一列像骨牌一樣倒下的護欄,B 版另有 8 人圍圈跳舞、氣球破掉後人群受驚的快閃情境。
  • 製作過程。對話共 13 則訊息,集中在 2025 年 6 月 22 日到 25 日,10 月 13 日再補一則。多數訊息只有一句話、只改一件事。
  • 腳踏車與墜落物從來不會撞到人。兩版的腳踏車都從行人身旁 4.16 單位處經過,墜落物落在行人 3.0 單位外,而程式判定撞到的距離只有 2.0 和 1.5。
  • 快閃情境很少失控。B 版跑 500 次,15 顆氣球每次都會破,但有 223 次沒有路人受驚,486 次沒有人跌倒,其餘 14 次也都只有兩人相撞。
  • 描述和程式有落差。Claude 的回覆常寫 realistic physics、chain reaction,實際上樓梯跌落和護欄連鎖都是照固定公式播放的動畫。用「check::」要求確認之後,Claude 調大了參數,但沒有實際驗證效果。

兩個版本 · 製作過程 · 實際執行 · 其他觀察 · 提示方法 · 模擬預防措施 · 限制 · 連結

2026 年 11 月 3 日更新:重新整理架構,並把兩個版本實際執行一遍。2025 年 6 月 25 日的原始版本保留在另一個網址。

1. 兩個公開版本

兩個版本的標題都是 Modern Campus Accident Simulation,各是一個 HTML 檔,用 Three.js r128 繪圖。場景相同:三棟灰色建築、三座加了金色邊條的樓梯、15 個隨機走動的路人。人物身高約 3.5 個場景單位,本文的距離都用這個單位。

表 1 兩個版本的內容
A 版:骨牌效應護欄倒成一片B 版:快閃群眾失控
共同情境Stair Fall Accident:一名路人從主樓梯上段翻滾而下。Bike Collision:腳踏車衝向一名行人。Falling Object:一塊建材從 35 單位高處落下。同左
第四個情境Domino Chain Reaction:12 片橘色護欄排成一列,第一片倒下後依序帶倒下一片,最後一片打到站在列尾的人。🎭 Flash Mob Gone Wrong:8 名路人圍成一圈跳舞,2 秒後放出 15 顆氣球;氣球破掉時,附近的路人受驚奔逃、互相碰撞。
操作滾輪縮放,WASD 移動鏡頭焦點,Q/E 調整高度;Reset Scene 讓路人回到隨機位置。同左。畫面上的說明寫著 Mouse: Orbit camera,但程式裡沒有滑鼠旋轉的功能。
和對話的關係骨牌情境不在分享的對話裡。含第 12 則訊息(check::)之後的參數,還沒有第 13 則加入的方向鍵。
A 版場景全景
圖 1 A 版場景,從西南方高處俯瞰(固定鏡頭)。左邊是主樓,中間是第二棟高樓,右邊是矮樓;矮樓前那一列橘黃色護欄是骨牌情境的道具,護欄後方的淺色斜面是側樓梯,主樓梯在矮樓的陰影裡。半空中的褐色小方塊是墜落物情境要丟下的建材,平時就懸在 25 單位高的地方。

2. 製作過程

分享的對話從 2025 年 6 月 22 日開始。前兩則訊息做的是第一張照片裡的水景廣場(Urban Water Feature Accident Simulation,7 個版本);第三則訊息起改用第二張照片的校園(Modern Campus Accident Simulation,29 個版本)。兩張照片在分享頁中是隱藏的。

表 2 對話中的 13 則訊息(版本編號照分享頁)
#日期訊息(原文)版本結果
16/22Animate an accident under the conditions of the picture in three.js(附照片)水景 v1滑倒落水、球擊落水兩個情境
26/23Third person perspective水景 v2–v7鏡頭改成繞著事故轉的第三人稱視角
36/23Analyze it in the same style(附第二張照片)校園 v1多層建築與樓梯;樓梯跌落、腳踏車、墜落物三個情境
46/23Make stair easy to seev2–v6台階改淺灰,加金色邊條與踢面,扶手加粗,主樓梯增為 15 階
56/23Npc walks narurallyv7–v10路人擺手走路、隨機停步轉向,增為 15 人
66/25add this scenario: 🎭 Flash Mob Gone Wrong(附 5 點規格)v11–v17回覆中途停下
76/25Continuev18–v19快閃情境完成
86/25fix ::(貼上墜落物與氣球那段程式)v20整理該段程式
96/25but no workingv21–v22Claude 判斷 createBalloon 在定義前就被呼叫,調整順序
106/25still notv23整份重寫,回覆中途停下
116/25Continuev24重寫完成
126/25check:: Balloons pop randomly, scaring nearby people(另列兩點)v25–v26驚嚇半徑 5→8、碰撞機率 1%→5%、碰撞距離 1.5→2.0
1310/13do not use mouse for change perspectivesv27–v29取消滑鼠,改用左右方向鍵轉視角

第 6 與第 10 則的回覆都在中途停下,下一則的「Continue」把它補完。第 8 到 11 則是同一個問題的四次修正,最後以整份重寫收場。

3. 實際執行的結果

Claude 每一輪的回覆都附上功能清單,常見的字眼有 realistic physics、collision detection、chain reaction。為了確認這些描述,把兩個公開版本的原始碼存下來,在無頭 Chrome 裡逐格執行:程式一行不改,只把亂數換成固定的種子,並照程式本身的設定以每格 0.016 秒計時。表 3 是每個情境的結果,圖 2 是依程式座標畫的俯視圖。

表 3 各情境的觸發方式與執行結果(前三個情境在 A、B 兩版的程式相同,結果也相同)
情境程式怎麼決定執行結果
樓梯跌落選中的人被放到主樓梯上段(z = 12、高 4.5),3 秒內照固定公式往前、往下移到 z = −27 的地面,同時翻兩圈。這條路線比樓梯平緩:人物一路高出台階 0.6 到 1.4 單位,越往下越高;離開最低一階時仍離地 1.3,再往前 9 單位才落地,接著在平地滑行 7 單位。
腳踏車車從 (−30, −10) 出發,以每秒 (12, 8) 前進 3 秒;與行人的距離小於 2.0 才算撞上。最近距離 4.16(第 2.3 秒),撞擊的程式從未執行,行人一直站著。
墜落物物體在 z = −15 處從 35 高直直落下,行人站在 z = −12;距離小於 1.5 才算擊中。2.7 秒落地,最近距離 3.0,落在行人身旁。
骨牌護欄(A)前一片倒到 0.3 弧度(約 17°)就啟動下一片;最後一片倒到 1.2 弧度就判定擊中。12 片在 0.9 秒內接連倒下,但每片會一直轉到 160° 左右(第一片 137°),整片沒入地面(圖 3)。1.3 秒判定擊中之後,那個人在原地翻滾到第 8 秒,位移不到 0.4。
快閃(B)氣球破掉時,8 單位內(含高度差)的旁觀者奔逃;兩名旁觀者相距不到 2.0 且其中一人在驚嚇中,每格有 5% 機率相撞,兩人身體傾斜 60° 以上。見表 4。
主樓(高 60)第二棟(高 45)矮樓(高 20)主樓梯側樓梯窄樓梯快閃舞圈(B 版)骨牌護欄 12 片(A 版):高 2.5、間距 3樓梯跌落:3 秒內滑到這裡腳踏車起點4.163.0墜落物落點(x 隨機,此例 x = 3)情境選中的人撞擊判定範圍(2.0、1.5)舞圈與氣球破裂範圍腳踏車路徑跌落路徑10 單位(人物約高 3.5)
圖 2 場景俯視圖(x 向右、z 向下),依程式中的座標繪製。腳踏車 3 秒內的路徑離被瞄準的行人最近 4.16,撞擊判定範圍只有 2.0;墜落物在 z = −15 直直落下,行人站在 z = −12,兩者的 x 相同(在 −5 到 5 之間隨機),判定範圍 1.5。快閃舞圈和幾乎整座窄樓梯都在矮樓的範圍裡。
A 版骨牌情境 0.54 秒
A 版骨牌情境 2.4 秒
圖 3 A 版骨牌情境,固定鏡頭。左:按下按鈕後 0.54 秒,護欄由左往右接連倒下。右:2.4 秒,每片護欄轉過了水平、沒入地面,只剩貼地的細線。
表 4 B 版快閃情境執行 500 次。每次重新載入頁面,先讓路人走 2 到 30 秒,再按一次按鈕,觀察 10.4 秒。
結果次數
15 顆氣球全部破掉500
沒有旁觀者受驚223
1 名旁觀者受驚191
2 名旁觀者受驚72
3 到 4 名旁觀者受驚14
有人跌倒(每次都是一對人相撞)14
三人以上連環碰撞0

原因在位置。15 人中有 8 人在跳舞,只剩 7 名旁觀者,一開始散在 80 × 60 的範圍裡;氣球在離圈心 4.0 到 7.8 處破掉,破掉時的高度從地面下 1.0 到地面上 7.4 不等(中位數 4.1)。氣球不是一路往上飄,而是像拋出去的球一樣升起再落下。驚嚇範圍又是 8 單位的立體距離,所以常常一個人也碰不到。真的相撞時,兩人的身體傾斜 60° 以上,卻多半繼續跑:追蹤 6 次相撞,有 5 次其中一人之後又跑了 10 單位以上。

4. 其他觀察

  • 快閃舞圈在矮樓裡。舞圈中心 (10, 5)、半徑 4,整圈落在矮樓(x 5 到 55、z −5 到 25)的範圍內;窄樓梯除了第一階的前緣,也在樓裡。Three.js 預設只畫面朝外的牆面,所以鏡頭在樓內時看得到舞群,轉到樓外就只看到牆(圖 4)。
  • 人和車會穿過建築與樓梯。場景沒有碰撞檢查。腳踏車情境裡被瞄準的行人站在主樓梯的範圍內,腳在地面、身體被台階截斷,從上方只看得到頭和肩膀;腳踏車也直接穿過樓梯。
  • 情境之間會互相影響。A 版跑過骨牌情境之後,人物的速度沒有歸零,Reset Scene 也不會清掉;這時按 Falling Object,物體離人還有 2.95 單位,人卻倒地翻滾。
  • 快閃情境要先重設才能重跑。B 版沒按 Reset Scene 就再按一次,氣球會維持破掉的狀態,不會再有人受驚。
  • 速度跟著螢幕更新率走。程式每畫一格就前進 0.016 秒,所以在 120 Hz 的螢幕上,所有動作都比 60 Hz 的螢幕快一倍。
B 版快閃情境,鏡頭在矮樓內
B 版快閃情境,鏡頭在矮樓外
圖 4 B 版快閃情境第 4 秒,固定鏡頭。左:鏡頭在矮樓裡,看得到舞圈和升起的氣球。右:同一時刻從矮樓外面看,舞群被牆擋住。

5. 提示方法

原文把這段對話的提示方法分成「溝通」「測試與驗證」「運作良好的部分」「有效策略」四組,內容有不少重疊。這裡合併成六點,每點附上對話裡的例子。

  1. 用照片交代場景。第 1 與第 3 則訊息都只有一句話加一張照片,建築、樓梯、水池怎麼擺都交給照片決定;in the same style 讓第二個場景沿用第一個場景的情境按鈕與第三人稱鏡頭。
  2. 從簡單開始,一次改一件事。先要一個意外,再依序要求 Third person perspective、Make stair easy to see、Npc walks narurally。一則訊息只改一件事,出了問題容易找到是哪一步。反例是一開始就要求「建立一個 Three.js 模擬,包含 15 個 NPC、增強樓梯、氣球物理……」。
  3. 複雜的新功能才寫規格。快閃情境牽涉舞蹈、氣球、驚嚇、碰撞與鏡頭,所以第 6 則訊息附了 5 點規格;簡單的修改一句話就夠。
  4. 回覆被截斷時說 Continue。第 6、第 10 則的回覆都在中途停下,一句 Continue 就接著完成。
  5. 壞掉時給確切的線索。fix :: 後面貼上出問題的程式段落,比 but no working、still not 更容易定位;瀏覽器主控台若有紅字錯誤訊息,整段貼上更好。這次修了兩輪仍不行,Claude 最後整份重寫(第 23、24 版)。
  6. 驗證要自己跑。第 12 則訊息用 check:: 要求確認三項效果,Claude 的回應是調大驚嚇半徑和碰撞機率,並說「The chaos is now much more visible」。實際跑 500 次,97% 沒有人跌倒(表 4),腳踏車和墜落物也從沒撞到人(表 3)。與其請 AI 檢查,不如請它把關鍵數字顯示出來,例如「在畫面上顯示腳踏車和行人的最近距離」或「連跑 20 次,統計跌倒人數」,再自己看結果。

6. 要模擬預防措施,意外得由場景造成

CL#4 的作業是「模擬一個意外事件,然後模擬一個預防措施」。這組程式裡的意外多半照劇本演出:樓梯跌落不看腳下的台階,護欄連鎖不看前後兩片有沒有碰到,撞擊只看兩點距離。照這種寫法,加扶手、拉開護欄間距、劃出自行車道都不會改變結果。要比較預防前後的差別,得先把觸發條件改成由場景決定,例如表 5。

表 5 把劇本改成機制
情境現在的寫法改成由場景決定可以比較的預防措施
樓梯跌落按下就跌,沿固定路線滑下依踩空的位置、離扶手的距離決定會不會跌、滾下幾階扶手、止滑條、中間平台
骨牌護欄前一片倒到 17° 就啟動下一片前一片碰到下一片才倒。照現在的尺寸(高 2.5、間距 3),倒平了也碰不到,連鎖其實不會發生間距大於高度、加重或固定底座
腳踏車兩點距離小於 2.0 才算撞上依車速、路徑和煞車距離計算人車分道、減速設施
快閃人群氣球 8 單位內的人逃跑,靠近時每格 5% 機率相撞依人群密度與逃跑方向計算推擠疏散動線、限制聚集人數

7. 限制

  • 這是重演,不是預測。情境由提示指定,照片只決定場景的樣子;程式不會從照片推算哪裡危險、意外多常發生。
  • 場景單位沒有定義。人物約 3.5 單位高,速度、高度、距離都不對應真實數值。
  • 結果只代表這兩個版本。表 3、表 4 的數字來自 2026 年 11 月 3 日下載的兩個公開版本。分享頁中的最新版(第 29 版)沒有公開成獨立連結,這裡沒有測。
  • 看不到原始照片。兩張照片在分享頁中被隱藏,無法對照場景是否符合照片。

沒有留言:

張貼留言