Google I/O 2021 において、Google は傾きと回転、および WebGL Overlay Viewのベータ版リリースを発表しました。これにより、まったく新しい方法でマッピング エクスペリエンスの構築が可能になります。Overlay Viewは Maps JavaScript APIに以前から存在する機能で、マップの上に透明なレイヤをレンダリングできます。開発者は何年にもわたり、マップの上に 2 次元の描画をするため Overlay View を使用してきましたが、Overlay View ではマップの上に実質的に浮かんでいる透明なレイヤにしかレンダリングできない状態でした。
WebGL Overlay View では、ベクターの基本地図のレンダリングに使用されるのと同じ WebGL レンダリングのライフサイクルにに直接働きかけて、利用できます。これにより、初めて 2 次元と 3 次元のオブジェクトを直接マップ上に高速にレンダリングできるようになったため、従来の Maps JavaScript API では不可能であったユーザー体験が構築可能になりました。
この記事では、Maps JavaScript API の新しい WebGL による機能の簡単な概要をご紹介します。これにより、次世代のマッピング エクスペリエンスを作成するために十分な知識が得られます。
WebGL とは
WebGL は低レベルのブラウザ API で、元は Mozilla Foundation により作られたものです。この API を使用すれば、スマートフォンやコンピュータなどのクライアント デバイスの GPU のレンダリング能力や処理能力を、ウェブアプリから利用できます。ブラウザ単独では、3D 空間のオブジェクトのレンダリングといった重い処理を実行することはできませんが、WebGL を使用すれば、そのような処理に特化して設計されたクライアント側の GPU で実行できます。
WebGL について詳しくは、WebGL の設計と保守をしている Khronos Group のドキュメントをご覧ください。
要件
WebGL Overlay View を使用するには、ベクターマップが有効な Map IDが必要です。また、マップ ID を作成するときは、傾きと回転を有効にすることを強くおすすめします。これを有効にしないと、マップはデフォルトの真上からのビューに限定されます。言い換えると、マップを 3 次元的に動かすことはできません。
マップ IDとベクターマップの詳しい使い方は、関連ドキュメントをご覧ください。
傾きと回転の設定
設定された傾きと回転でマップを読み込むには、マップを作成するときに「tilt」と「heading」プロパティの値を指定します。
const mapOptions = {
mapId: "15431d2b469f209e",
tilt: 0,
heading: 0,
zoom: 17,
center: {
lat: -33.86957547870852,
lng: 151.20832318199652
}
}
const mapDiv = document.getElementById("map");
const map = new google.maps.Map(mapDiv, mapOptions);
tilt は度単位の整数または浮動小数点数で、値は 0 から 67.5 までです。0 度はデフォルトの真下に向いたビューを、67.5 は最大の傾斜角度を意味します。設定可能な tilt の最大値はズームレベルによっても異なります。
回転は heading プロパティで、0 から 360 度までの整数または浮動小数点数として設定します。0 と 360 は北の方向を意味します。
また、傾きと回転は実行時のいつでも、プログラムからマップ オブジェクトに対して「setTilt」と「setHeading」を直接呼び出して変更できます。この機能は、ユーザーの操作などのイベントに対応してマップの向きを変える場合に役立ちます。
map.setTilt(45);
map.setHeading(180);
WebGL Overlay View をマップへ追加する
const webglOverlayView = new google.maps.WebglOverlayView;
webglOverlayView.setMap(map);
- 「onAdd」では、たとえばフェッチや最終的にオーバーレイに渡すための中間データ構造の作成など、前処理をします。これらの処理をすべてここで行うのは、マップのレンダリング速度が低下しないことを保証するためです。
- 「onRemove」では、すべての中間オブジェクトを破棄します。できればより早い段階で破棄します。
- 「onContextRestored」はマップがレンダリングされる前に呼び出され、WebGL の状態、たとえばシェーダー、GL バッファ オブジェクトなどの初期化、バインド、再初期化をします。
- 「onDraw」では、マップの実際のレンダリングと、その関連する操作に指定された動作をします。シーンをレンダリングするための描画呼び出しは、できるだけ最小限にしてください。ここで多くの動作をすると、基本地図のレンダリングと、WebGL で行うすべての動作の速度が低下します。
- 「onContextLost」では、既存の GL ステートに関連付けられているすべてのステートをクリーンアップします。この時点では WebGL コンテキストは破棄されているため、これらのステートは無意味になっています。
webglOverlayView.onDraw = (gl,
coordinateTransformer) => { //レンダリングを実行 }
カメラ アニメーションの作成
const cameraOptions = {
tilt: 0,
heading: 0
}
function animateCamera () {
cameraOptions.tilt += 1;
cameraOptions.heading += 1;
map.moveCamera(cameraOptions);
}
requestAnimationFrame(animateCamera);