☀️
【VRChat】動くガリレオ温度計を作ってみた
はじめに
自分の作ったワールドにガリレオ温度計を置きたい!
アタラクシアプロジェクト様の作成された温度計を基に実際の気温に応じてガラス球が上下するガリレオ温度計を作成しました。
ガラス球の移動について数年ぶりに力学の計算を行いましたので、せっかくなので記事にまとめることにしました。
もし間違いがあれば優しくマサカリを投げていただけると幸いです。
作ったもの
zennは動画が載せられないのでYouTubeで共有
気温を取得する
気温の取得には Open-Meteo API を利用しました。
商用でなければ無料で利用可能でかつAPIキーも不要で、簡単なGETメソッドでデータを取得できます。
private VRCUrl url = new VRCUrl(
"https://api.open-meteo.com/v1/forecast?latitude=35.6416&longitude=139.6724&hourly=temperature_2m&timezone=Asia%2FTokyo&forecast_days=1"
);
ガラス球を動かす
ガリレオ温度計内の球体を仮定したガラス球の運動に関わる力は以下の画像の三要素とし、運動方程式で記述します。

運動方程式の立式
温度依存パラメータ
- 水の密度:
\rho_{T} = f(T) [\mathrm{kg/m^3}] - 水の粘性係数:
\mu_{T} = g(T) [\mathrm{kg/(m \cdot s)}]
定数・変数
- 現在の流体温度:
T_{current} or[^\circ\mathrm{C}] [\mathrm{K}] - ガラス球が沈む基準温度:
T_{a} or[^\circ\mathrm{C}] [\mathrm{K}] - ガラス球の半径:
r [\mathrm{m}] - ガラス球の体積:
V [\mathrm{m}^3] -
で表せますが、式が複雑になるので別途定義V = \frac{4}{3}\pi r^3
-
力の図(y方向)
- 浮力:
\rho_{T_{current}} V g [\mathrm{N}] - 重力:
\rho_{T_{a}} V g [\mathrm{N}] - 粘性抵抗:
6\pi \mu_{T_{current}} r y' [\mathrm{N}] - ストークスの法則が成立することを仮定
立式
運動方程式を速度 v=y' について解く
まず両辺を
ここで
ただし
a = \frac{6\pi\mu_{T_\mathrm{current}}r}{\rho_{T_{a}} V} b = \frac{\rho_{T_\mathrm{current}} - \rho_{T_{a}}}{\rho_{T_{a}}}g
この方程式の一般解は
式に具体的な値を戻すと
「最初は静止(初速度ゼロ)」を仮定すると
すなわち
これを一般解に代入して特殊解は、
水の密度・粘度関数
密度 \rho(T)
ITS-90 温度スケール(5 ℃ ≤
動粘性係数 \mu(T)
純水の粘性を絶対温度
実装
vのtについての関数を解きましたが、結局実装したのは速度についてのtについての式になります(微分方程式は解きたかっただけ)。
void Update(){
velocity += (b - a * velocity) * dt; // 運動方程式の解いてる過程の*の式を用いる
float dy = velocity * dt; // 速度から単位時間あたりの実際の移動量を計算
Vector3 pos = fObj.transform.localPosition;
pos.y += dy; // 位置座標を更新
}
おわりに
ワールドに置いてるから遊びに来てね!
Discussion