Модели

Модели — это 3D-ресурсы, которые можно добавлять в сцену для представления объектов. Фотореалистичные 3D-карты в Maps JavaScript API поддерживают включение моделей gLTF. Эти модели можно масштабировать и вращать для дальнейшей настройки.

Модели должны поддерживать основные свойства glTF PBR . Никакие расширения или свойства расширений не поддерживаются.

Добавить модель

Конструктор Model3DElement принимает набор Model3DElementOptions , определяющий координаты модели LatLng , а также набор параметров для поддержки позиционирования модели.

Модели поддерживают следующие опции:

  • position : местоположение модели, выраженное в координатах LatLng .
  • orientation : вращение системы координат модели. Вращения применяются в следующем порядке: крен, наклон и затем курс.
  • scale : Масштабирует модель в ее координатном пространстве. Значение по умолчанию — 1 .
  • altitudeMode : как интерпретируется высота, выраженная в position .
  • src : URL-адрес модели.

В следующем примере показано добавление моделей на карту и их изменение с использованием доступных параметров настройки:

async function init() {
  const { Map3DElement, MapMode, Model3DElement } = await google.maps.importLibrary("maps3d");

  const map = new Map3DElement({
    center: {lat: 37.7438, lng: -121.5088, altitude: 1800},
    heading: -90,
    tilt: 90,
    mode: MapMode.SATELLITE,
  });

  document.body.append(map);
  
  const models = [
    // A model with regular settings.
    {
      position: {lat: 37.76, lng: -121.63, altitude: 0},
      orientation: {tilt: 270},
    },
    // Scaled down model.
    {
      position: {lat: 37.75, lng: -121.63, altitude: 0},
      orientation: {tilt: 270},
      scale: 0.8,
    },
    // Scaled up model.
    {
      position: {lat: 37.735, lng: -121.63, altitude: 0},
      orientation: {tilt: 270},
      scale: 1.2,
    },
    // A model with an additional transformation applied.
    {
      position: {lat: 37.72, lng: -121.63, altitude: 0},
      orientation: {tilt: 270, roll: 90},
    },
    // Non-clamped to the ground model.
    {
      position: {lat: 37.71, lng: -121.63, altitude: 1000},
      altitudeMode: 'RELATIVE_TO_GROUND',
      orientation: {tilt: 270},
    },
  ];

  for (const {position, altitudeMode, orientation, scale} of models) {
    const model = new Model3DElement({
      src: 'https://storage.googleapis.com/maps-web-api.appspot.com/gltf/windmill.glb',
      position,
      altitudeMode,
      orientation,
      scale,
    });

    map.append(model);
  }
}

init();

Добавьте интерактивную модель

Модели также поддерживают взаимодействие. В следующем примере масштаб модели изменяется при нажатии.

async function init() {
  const { Map3DElement, MapMode, Model3DInteractiveElement } = await google.maps.importLibrary("maps3d");

  const map = new Map3DElement({
    center: {lat: 37.7438, lng: -121.5088, altitude: 1800},
    heading: -90,
    tilt: 90,
    mode: MapMode.SATELLITE,
  });

  document.body.append(map);

  const model = new Model3DInteractiveElement({
    src: 'https://storage.googleapis.com/maps-web-api.appspot.com/gltf/windmill.glb',
    position: {lat: 37.76, lng: -121.63, altitude: 0},
    scale: 1.0,
  });

  model.addEventListener('gmp-click', (event) => {
    model.scale = (Math.random() * (1 - 2)).toFixed(2);

  });

  map.append(model);
}

init();