於瀏覽器中運作的強震動模擬器。讀取真實的強震觀測記錄(miniSEED 波形資料),依其波形驅動虛擬空間中的振動台加振,透過 3D 物理演算擬真重現地震時室內家具的行為(轉倒、滑動、擺盪等)。
以 Vite + React + Tailwind CSS + shadcn/ui 重構,介面為繁體中文。
| 層 | 技術 |
|---|---|
| 建置 | Vite 8 |
| UI | React 19、Tailwind CSS 4、shadcn/ui、Radix UI |
| 3D 繪圖 | three.js(three 0.185) |
| 剛體物理 | cannon-es 0.20 |
| 語言 | TypeScript 5 |
模擬核心(Three.js 場景、Cannon 物理世界、DSP、波形/軌跡繪製、物理迴圈)封裝為與框架無關的 SimEngine(src/engine/simEngine.ts),React 僅負責 UI 外殼並以訂閱機制反映引擎狀態;逐幀熱路徑直接寫入 DOM,避免每秒 60 次的 React 重繪。
src/
├─ engine/
│ ├─ mseed.ts # miniSEED 解析器(counts/10000 = gal)
│ ├─ dsp.ts # Butterworth HPF、積分、建物應答、正弦波生成
│ ├─ furniture.ts # 家具目錄(住家 / 辦公室)
│ └─ simEngine.ts # 模擬引擎(Three.js + cannon-es)
├─ components/ # React + shadcn UI(控制面板、波形、軌跡、HUD、說明)
└─ App.tsx
- 3D 即時物理演算:結合 three.js(3D 繪圖)與 cannon-es(剛體演算),即時模擬同時受地震波三分量(NS、EW、UD)輸入的複雜家具行為。
- 多樣家具模型與客製:可配置書架、衣櫃、書桌、椅子、床、冰箱、天花板吊燈等。可自控制面板變更各家具「質量」與「重心高(%)」,比較參數差異造成的行為變化。
- 波形圖連動視覺化:由讀入資料自動生成加速度・速度・變位圖(NS・EW・UD 三分量),並顯示與模擬進行時刻完全連動的播放游標。
- JMA 計測震度:依 氣象廳計測震度算法(頻域濾波→向量合成→0.3 秒判定)計算並顯示讀入記錄的計測震度與震度階級。
- 進階播放控制:可變更播放速度(0.25×〜2.0×)、調整振幅倍率(最大 50×,供放大弱震觀察)與起始時刻(跳過)。
- 建物應答:多質點剪力型模型之時刻歷應答解析,可用指定樓層的地板應答加振。
支援 miniSEED(SEED 2.x) 三分量加速度記錄。依通道方位碼(Z/N/E)自動分離為 UD / NS / EW。
- 加速度換算:
10000 counts = 1 cm/s²(= 1 gal)→ 加速度(gal) = counts ÷ 10000 - 支援編碼:16/32-bit 整數、32/64-bit 浮點、Steim-1 / Steim-2 壓縮(自 Blockette 1000 判定)
- 範例檔:
public/sample.mseed(1A3A17C_20260707T044704Z_20260707T044804Z.mseed,測站 3A17C,3 分量 @ 50Hz,60 秒,計測震度約 2.3)。可於介面按「載入範例波形」直接使用。
若無記錄,亦可用「正弦波加振」指定方向・周期・最大變位・持續時間生成合成波。
家具的傾倒/滑動有明確的物理門檻——大致要到計測震度 5 弱(約 150〜250 gal)以上才會發生。因此震度 1〜3 的弱震記錄,家具幾乎不動是物理上正確的結果(可由 UI 顯示的計測震度確認)。欲觀察明顯的傾倒/滑動,請:
- 提高「振幅倍率」(例如 20〜40×),或
- 改用強震記錄,或
- 用「正弦波加振」給予大變位長周期波(例:最大變位 20cm、周期 0.6s ≈ 2700 gal)。
counts→加速度 換算係數定義於
src/engine/mseed.ts的COUNTS_PER_GAL(預設 10000)。若你的測站靈敏度不同,請調整此常數;它會直接改變計測震度與家具反應。
由加速度波形積分為速度・變位時,採氣象廳(JMA)官方積分漸化式(齋藤1978 之係數設計)以抑制低頻雜訊導致的基線飄移:速度波形使用「截止 5 秒之 3 次 Butterworth 積分特性」,變位波形使用「1 倍強震計特性(固有周期
速度:$v_t = G(a_t - a_{t-1} - a_{t-2} + a_{t-3}) - (A_1 v_{t-1} + A_2 v_{t-2} + A_3 v_{t-3})$
變位:$d_t = H(D_0 a_t + D_1 a_{t-1} + D_2 a_{t-2}) - (C_1 d_{t-1} + C_2 d_{t-2})$
漸化式係數為 100Hz 設計,故非 100Hz 之記錄(如範例的 50Hz)會先線性重取樣至 100Hz。
計測震度另依 JMA 頻域算法計算(見 src/engine/jma.ts):對三分量加速度套用 JMA 濾波器(週期效應
即時物理引擎在微小外力連續作用下,本應靜止的物體會產生滑動般的潛移。本模擬器每子步
-
法線方向實效重力:每幀計入上下動成分
$a_{y,table}$ ,計算$g_{eff} = \max(0,\ g + a_{y,table})$ 。 -
靜摩擦上限比較:比較消除相對速度所需撃力
$J_{need} = m\sqrt{(v_x - v_{table,x})^2 + (v_z - v_{table,z})^2}$ 與庫倫摩擦上限$J_{max} = \mu_s N \Delta t = 1.3\mu_k \cdot m \cdot g_{eff} \cdot \Delta t$ 。 - 速度固著:$J_{need} \le J_{max}$ 時判定慣性力低於靜摩擦限界,覆寫動摩擦計算使家具水平速度強制固著於振動台;同時對垂直軸(Yaw)旋轉滑動施加上限式扭轉摩擦撃力以抑制不自然的旋轉。
- 物理時間步長細分為 1/240 秒,求解器迭代次數設為 40,於瀏覽器環境取得計算負荷與物理精度的平衡。
- 依家具個別設定重心偏移(
cogY),重現貼近現實的轉倒力矩。
等質量・等剛性剪力型建物之時刻歷應答解析。依構造種別略算式(S造 T₁=0.03H、RC造 T₁=0.02H,層高 4m)逆算剛度
npm install # 安裝相依套件
npm run dev # 開發伺服器
npm run build # 產出 dist/
npm run preview # 預覽 build 結果本模擬器為以教育・防災宣導為目的之簡易物理演算展示,並非準確重現或預測實際地震時家具行為、建物應答與室內災損之工具。結果取決於物理引擎的數值計算條件(時間步長、接觸剛度、摩擦模型等),相同輸入在不同設定下可能有很大差異。
請勿將本程式的計算結果,作為實際建築物或家具的耐震設計、安全性評估,或防災計畫・災損想定之依據。 現實家具的行為,會因地材的微小不均、建物的共振特性等各種因素而複雜變化。對於使用本程式所生之任何損害・不利益,作者概不負責。
讀取各機構之強震記錄時,請遵守其資料利用規約與出處標示條件。記錄資料本身不包含於本工具中。