Skip to content

ExpTechTW/shaking_simulation

 
 

Repository files navigation

強震動室內家具挙動模擬器

於瀏覽器中運作的強震動模擬器。讀取真實的強震觀測記錄(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、波形/軌跡繪製、物理迴圈)封裝為與框架無關的 SimEnginesrc/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)

支援 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.mseed1A3A17C_20260707T044704Z_20260707T044804Z.mseed,測站 3A17C,3 分量 @ 50Hz,60 秒,計測震度約 2.3)。可於介面按「載入範例波形」直接使用。

若無記錄,亦可用「正弦波加振」指定方向・周期・最大變位・持續時間生成合成波。

關於「家具幾乎不動」

家具的傾倒/滑動有明確的物理門檻——大致要到計測震度 5 弱(約 150〜250 gal)以上才會發生。因此震度 1〜3 的弱震記錄,家具幾乎不動是物理上正確的結果(可由 UI 顯示的計測震度確認)。欲觀察明顯的傾倒/滑動,請:

  1. 提高「振幅倍率」(例如 20〜40×),或
  2. 改用強震記錄,或
  3. 用「正弦波加振」給予大變位長周期波(例:最大變位 20cm、周期 0.6s ≈ 2700 gal)。

counts→加速度 換算係數定義於 src/engine/mseed.tsCOUNTS_PER_GAL(預設 10000)。若你的測站靈敏度不同,請調整此常數;它會直接改變計測震度與家具反應。


解析方法(演算法詳述)

1. 訊號處理(DSP)

由加速度波形積分為速度・變位時,採氣象廳(JMA)官方積分漸化式(齋藤1978 之係數設計)以抑制低頻雜訊導致的基線飄移:速度波形使用「截止 5 秒之 3 次 Butterworth 積分特性」,變位波形使用「1 倍強震計特性(固有周期 $T_0$ = 6 s、減衰定數 $h$ = 0.55)」之漸化式。

速度:$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 濾波器(週期效應 $\sqrt{1/f}$ × 高域遮斷 × 低域遮斷)後反轉換取向量合成,求合計 0.3 秒以上超過的加速度 $a_0$,$I = 2\log_{10}(a_0) + 0.94$。

2. 物理模型(撃力式靜摩擦)

即時物理引擎在微小外力連續作用下,本應靜止的物體會產生滑動般的潛移。本模擬器每子步 $\Delta t$ 加入撃力(impulse)式靜摩擦演算以消除此問題:

  • 法線方向實效重力:每幀計入上下動成分 $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)旋轉滑動施加上限式扭轉摩擦撃力以抑制不自然的旋轉。

3. 剛體演算穩定化

  • 物理時間步長細分為 1/240 秒,求解器迭代次數設為 40,於瀏覽器環境取得計算負荷與物理精度的平衡。
  • 依家具個別設定重心偏移(cogY),重現貼近現實的轉倒力矩。

4. 建物應答(多質點剪力型模型)

等質量・等剛性剪力型建物之時刻歷應答解析。依構造種別略算式(S造 T₁=0.03H、RC造 T₁=0.02H,層高 4m)逆算剛度 $k$;阻尼採 Rayleigh 型;數值積分為 Newmark-β 法(平均加速度 β=1/4, γ=1/2)。剛度矩陣為三對角,以 Thomas 法每步 $O(N)$ 求解。水平二分量(NS, EW)解析,UD 直接使用地表波。


開發與建置

npm install      # 安裝相依套件
npm run dev      # 開發伺服器
npm run build    # 產出 dist/
npm run preview  # 預覽 build 結果

免責聲明

本模擬器為以教育・防災宣導為目的之簡易物理演算展示,並非準確重現或預測實際地震時家具行為、建物應答與室內災損之工具。結果取決於物理引擎的數值計算條件(時間步長、接觸剛度、摩擦模型等),相同輸入在不同設定下可能有很大差異。

請勿將本程式的計算結果,作為實際建築物或家具的耐震設計、安全性評估,或防災計畫・災損想定之依據。 現實家具的行為,會因地材的微小不均、建物的共振特性等各種因素而複雜變化。對於使用本程式所生之任何損害・不利益,作者概不負責。

讀取各機構之強震記錄時,請遵守其資料利用規約與出處標示條件。記錄資料本身不包含於本工具中。

About

A web-based strong motion simulator. It loads K-NET/KiK-net or JMA format CSV waveforms and simulates earthquake-induced furniture behaviors (overturning/sliding) using 3D physics. / Webブラウザ上で動作する振動台シミュレーターです。気象庁や防災科研(K-NET, KiK-net)の観測波形を読み込み、3D物理演算で地震動とそれに伴う家具の挙動を再現します。

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 97.6%
  • CSS 2.0%
  • HTML 0.4%