コンテンツにスキップ

OverlayPlugin

OverlayPlugin は、地理座標(緯度/経度/高度)のセットを追跡し、毎レンダーフレームでスクリーン座標に投影します。これにより、カメラの移動に追従する HTML オーバーレイ(マーカー、ラベル、ツールチップなど)を実現できます。

プラグインが担当するのは投影計算のみです。実際の HTML 要素のレンダリングはアプリケーション側に委ねられるため、スタイリングやインタラクションを完全に制御できます。

import ThreeView from "@navaramap/three";
import { DefaultPlugin } from "@navaramap/three-default-plugin";
import { OverlayPlugin, moveOverlayElement } from "@navaramap/three-plugins";
const view = new ThreeView({ container, animation: true });
const defaultPlugin = new DefaultPlugin();
const overlayPlugin = new OverlayPlugin({ maxDistance: 100_000 });
view.addPlugin(defaultPlugin);
view.addPlugin(overlayPlugin);
await view.init();
// 追跡する位置を設定
overlayPlugin.setPositions([
{ id: "tokyo-tower", lng: 139.7454, lat: 35.6586, alt: 0 },
{ id: "skytree", lng: 139.8107, lat: 35.7101, alt: 0 },
]);
// 毎フレーム HTML 要素を更新
const unsub = overlayPlugin.onUpdate(({ projected }) => {
for (const [id, pos] of projected) {
const el = document.getElementById(id);
if (el) {
el.style.display = "";
moveOverlayElement(el, pos.x, pos.y);
}
}
});
// クリーンアップ
unsub();
overlayPlugin.dispose();
new OverlayPlugin(config?: OverlayConfig)
プロパティデフォルト説明
maxDistancenumber100_000カメラからこの距離(メートル)以上離れた位置はスキップされる
setPositions(positions: WorldPosition[]): void

追跡するワールド座標のセットを置き換えます。次のレンダーフレームで自動的に再投影されます。

onUpdate(fn: (state: OverlayState) => void): () => void

投影更新を購読します。コールバックは毎レンダーフレームで最新の投影スクリーン座標とともに呼び出されます。購読解除関数を返します。

dispose(): void

preRender フックを削除し、すべてのリスナーをクリアし、内部状態をリセットします。

プロパティ説明
idstring投影マップのキーとして使用される一意の識別子
lngnumber経度(度)
latnumber緯度(度)
altnumber高度(メートル)
プロパティ説明
xnumberスクリーン X 座標(ピクセル)
ynumberスクリーン Y 座標(ピクセル)
distancenumberカメラからの距離(メートル、ECEF ユークリッド距離)
プロパティ説明
projectedMap<string, ProjectedPosition>位置 ID からスクリーン座標へのマップ。maxDistance 以内の位置のみ含まれる。
moveOverlayElement(el: HTMLElement, x: number, y: number): void

絶対配置された HTML 要素を、GPU アクセラレーションされた CSS translate() 変換を使用して指定のスクリーン座標に配置します。便利関数であり、独自の配置ロジックを実装することもできます。

ProjectedPositiondistance フィールドを使って、不透明度のフェードやサイズのスケーリングなどの視覚効果を実現できます。

overlayPlugin.onUpdate(({ projected }) => {
for (const [id, pos] of projected) {
const el = document.getElementById(id);
if (!el) continue;
moveOverlayElement(el, pos.x, pos.y);
// 距離に応じてマーカーをフェードアウト
const opacity = Math.max(0.3, 1 - pos.distance / 100_000);
el.style.opacity = String(opacity);
}
});
  • PersonViewPlugin: OverlayPlugin と組み合わせて一人称 / 三人称ビューのナビゲーションとマーカーを実現
  • About three_plugins: パッケージ概要