こんにちは、山手線3Dジオラマの開発者です。
今回は、ブラウザ上でリアルな鉄道模型シミュレーターを動かすために採用した技術スタックについて解説します。
1. なぜMapLibre GL JSなのか?
地図ライブラリにはLeafletやMapbox GL JSなど様々な選択肢がありますが、今回はオープンソースでWebGLのパフォーマンスを最大限に引き出せるMapLibre GL JSを採用しました。
特に、カスタムレイヤー機能を使ってThree.jsと連携できる点が決め手となりました。
Three.jsとの座標同期の課題
地図(メルカトル図法)の座標系と、3D空間(Three.js)の座標系を合わせるのには苦労しました。以下のコードで、MapLibreの行列をThree.jsのカメラに適用しています。
// MapLibreの行列をThree.jsに適用する処理
render: function (gl, matrix) {
const m = new THREE.Matrix4().fromArray(matrix);
const l = new THREE.Matrix4()
.makeTranslation(modelOrigin.x, modelOrigin.y, 0)
.scale(new THREE.Vector3(scale, -scale, scale));
this.camera.projectionMatrix = m.multiply(l);
this.renderer.render(this.scene, this.camera);
}
2. 電車の滑らかな動きの実現
ただ座標を移動させるだけでは、カクついたり、カーブで不自然な動きをしてしまいます。そこで、事前に計算した軌道データ(LUT: Look Up Table)を用意し、線形補間を行うことで滑らかなアニメーションを実現しました。
Turf.jsを使って線路データを1m単位で再計算
3. 今後の展望
現在は山手線のみですが、今後は京浜東北線や中央線など、並走する路線の実装も予定しています。複数路線のダイヤグラム同期など、さらなる技術的課題に挑戦していきます。