Widok nakładki WebGL

Wyświetl próbkę

Za pomocą widoku nakładki WebGL możesz dodawać treści do map bezpośrednio za pomocą WebGL lub popularnych bibliotek graficznych, takich jak Three.js. Widok nakładki WebGL zapewnia bezpośredni dostęp do tego samego kontekstu renderowania WebGL, którego Google Maps Platform używa do renderowania wektorowej mapy bazowej. Użycie wspólnego kontekstu renderowania zapewnia korzyści, takie jak okluzja głębi w przypadku geometrii budynków 3D oraz możliwość synchronizacji treści 2D/3D z renderowaniem mapy bazowej. Obiekty renderowane za pomocą widoku nakładki WebGL można też powiązać ze współrzędnymi geograficznymi, dzięki czemu przesuwają się, gdy przeciągasz, przybliżasz, przesuwasz lub przechylasz mapę.

Wymagania

Aby używać widoku nakładki WebGL, musisz wczytać mapę za pomocą identyfikatora mapy z włączoną mapą wektorową. Zdecydowanie zalecamy włączenie opcji pochylenia i obrotu podczas tworzenia identyfikatora mapy, aby umożliwić pełną kontrolę nad kamerą 3D. Więcej informacji znajdziesz w omówieniu

Dodawanie widoku nakładki WebGL

Aby dodać nakładkę do mapy, zaimplementuj google.maps.WebGLOverlayView, a następnie przekaż do niej instancję mapy za pomocą setMap:

// Create a map instance.
const map = new google.maps.Map(mapDiv, mapOptions);

// Create a WebGL Overlay View instance.
const webglOverlayView = new google.maps.WebGLOverlayView();

// Add the overlay to the map.
webglOverlayView.setMap(map);

Punkty zaczepienia cyklu życia

WebGL Overlay View udostępnia zestaw wywołań zwrotnych, które są wywoływane w różnych momentach cyklu życia kontekstu renderowania WebGL wektorowej mapy bazowej. W tych punktach cyklu życia możesz skonfigurować, narysować i usunąć wszystko, co chcesz wyświetlić w nakładce.

  • onAdd() jest wywoływana podczas tworzenia nakładki. Używaj jej do pobierania lub tworzenia struktur danych pośrednich przed narysowaniem nakładki, które nie wymagają natychmiastowego dostępu do kontekstu renderowania WebGL.
  • Funkcja onContextRestored({gl}) jest wywoływana, gdy kontekst renderowania jest dostępny. Używaj go do inicjowania lub wiązania dowolnego stanu WebGL, takiego jak shadery, obiekty bufora GL itp. onContextRestored() przyjmuje WebGLStateOptions instancję, która ma jedno pole:
    • gl to uchwyt do WebGLRenderingContext używanego przez mapę bazową.
  • onDraw({gl, transformer}) renderuje scenę na mapie bazowej. Parametry onDraw() to obiekt WebGLDrawOptions, który ma 2 pola:
    • gl to uchwyt do WebGLRenderingContext używanego przez mapę bazową.
    • transformer udostępnia funkcje pomocnicze do przekształcania współrzędnych mapy w macierz widoku modelu i projekcji, która może być używana do przekształcania współrzędnych mapy w przestrzeń świata, przestrzeń kamery i przestrzeń ekranu.
  • Funkcja onContextLost() jest wywoływana, gdy kontekst renderowania zostanie utracony z dowolnego powodu. W tym miejscu należy wyczyścić wszystkie istniejące stany GL, ponieważ nie są już potrzebne.
  • onStateUpdate({gl}) aktualizuje stan GL poza pętlą renderowania i jest wywoływana, gdy wywoływana jest funkcja requestStateUpdate. Przyjmuje instancję WebGLStateOptions, która ma jedno pole:
    • gl to uchwyt do WebGLRenderingContext używanego przez mapę bazową.
  • onRemove() jest wywoływana, gdy nakładka jest usuwana z mapy za pomocą funkcji WebGLOverlayView.setMap(null). W tym miejscu należy usunąć wszystkie obiekty pośrednie.

Oto podstawowa implementacja wszystkich funkcji cyklu życia:

const webglOverlayView = new google.maps.WebGLOverlayView();

webglOverlayView.onAdd = () => {
  // Do setup that does not require access to rendering context.
}

webglOverlayView.onContextRestored = ({gl}) => {
  // Do setup that requires access to rendering context before onDraw call.
}

webglOverlayView.onStateUpdate = ({gl}) => {
  // Do GL state setup or updates outside of the render loop.
}

webglOverlayView.onDraw = ({gl, transformer}) => {
  // Render objects.
}

webglOverlayView.onContextLost = () => {
  // Clean up pre-existing GL state.
}

webglOverlayView.onRemove = () => {
  // Remove all intermediate objects.
}

webglOverlayView.setMap(map);

Resetowanie stanu GL

WebGL Overlay View udostępnia kontekst renderowania WebGL mapy bazowej. Z tego powodu po zakończeniu renderowania obiektów bardzo ważne jest przywrócenie stanu GL do pierwotnego stanu. Niepowodzenie zresetowania stanu GL prawdopodobnie spowoduje konflikty stanu GL, które uniemożliwią renderowanie zarówno mapy, jak i wszelkich określonych przez Ciebie obiektów.

Resetowanie stanu GL jest zwykle obsługiwane w funkcji onDraw(). Na przykład Three.js udostępnia funkcję pomocniczą, która usuwa wszelkie zmiany w stanie GL:

webglOverlayView.onDraw = ({gl, transformer}) => {
  // Specify an object to render.
  renderer.render(scene, camera);
  renderer.resetState();
}

Jeśli mapa lub obiekty nie są renderowane, bardzo prawdopodobne jest, że stan GL nie został zresetowany.

Przekształcenia współrzędnych

Położenie obiektu na mapie wektorowej jest określane przez podanie kombinacji współrzędnych geograficznych (szerokości i długości geograficznej) oraz wysokości. Grafika 3D jest jednak określana w przestrzeni świata, przestrzeni kamery lub przestrzeni ekranu. Aby ułatwić przekształcanie współrzędnych mapy w te powszechnie używane przestrzenie, WebGL Overlay View udostępnia funkcję pomocniczą coordinateTransformer.fromLatLngAltitude(latLngAltitude, rotationArr, scalarArr) w haku onDraw(), która przyjmuje te wartości i zwraca Float64Array:

  • latLngAltitude: współrzędne geograficzne szerokości, długości i wysokości w formacie LatLngAltitude lub LatLngAltitudeLiteral.
  • rotationArr: Float32Array kątów obrotu Eulera podanych w stopniach.
  • scalarArr: Float32Array skalarów do zastosowania na osi głównej.

Na przykład poniższy kod używa fromLatLngAltitude() do utworzenia macierzy projekcji kamery w Three.js:

const camera = new THREE.PerspectiveCamera();
const matrix = coordinateTransformer.fromLatLngAltitude({
    lat: mapOptions.center.lat,
    lng: mapOptions.center.lng,
    altitude: 120,
});
camera.projectionMatrix = new THREE.Matrix4().fromArray(matrix);

Przykład

Oto prosty przykład użycia Three.js, popularnej biblioteki WebGL typu open source, do umieszczenia obiektu 3D na mapie. Aby zapoznać się z pełnym przewodnikiem po korzystaniu z WebGL Overlay View do tworzenia przykładu, który widzisz u góry tej strony, wypróbuj ćwiczenia z programowania poświęcone tworzeniu map z akceleracją WebGL.

const webglOverlayView = new google.maps.WebGLOverlayView();
let scene, renderer, camera, loader;

webglOverlayView.onAdd = () => {
  // Set up the Three.js scene.
  scene = new THREE.Scene();
  camera = new THREE.PerspectiveCamera();
  const ambientLight = new THREE.AmbientLight( 0xffffff, 0.75 ); // Soft white light.
  scene.add(ambientLight);

  // Load the 3D model with GLTF Loader from Three.js.
  loader = new GLTFLoader();
  loader.load("pin.gltf");
}

webglOverlayView.onContextRestored = ({gl}) => {
  // Create the Three.js renderer, using the
  // maps's WebGL rendering context.
  renderer = new THREE.WebGLRenderer({
    canvas: gl.canvas,
    context: gl,
    ...gl.getContextAttributes(),
  });
  renderer.autoClear = false;
}

webglOverlayView.onDraw = ({gl, transformer}) => {
  // Update camera matrix to ensure the model is georeferenced correctly on the map.
  const matrix = transformer.fromLatLngAltitude({
      lat: mapOptions.center.lat,
      lng: mapOptions.center.lng,
      altitude: 120,
  });
camera.projectionMatrix = new THREE.Matrix4().fromArray(matrix);

  // Request a redraw and render the scene.
  webglOverlayView.requestRedraw();
  renderer.render(scene, camera);

  // Always reset the GL state.
  renderer.resetState();
}

// Add the overlay to the map.
webglOverlayView.setMap(map);