WebGL Overlay View ile doğrudan WebGL'yi veya Three.js gibi popüler grafik kitaplıklarını kullanarak haritalarınıza içerik ekleyebilirsiniz. WebGL Overlay View, Google Haritalar Platformu'nun vektör taban haritasını oluşturmak için kullandığı WebGL oluşturma bağlamına doğrudan erişim sağlar. Paylaşılan oluşturma bağlamının bu şekilde kullanılması, 3D bina geometrisiyle derinlik tıkanması ve 2D/3D içeriği temel harita oluşturmayla senkronize etme gibi avantajlar sağlar. WebGL Overlay View ile oluşturulan nesneler enlem/boylam koordinatlarına da bağlanabilir. Bu nedenle, haritayı sürüklediğinizde, yakınlaştırdığınızda, kaydırdığınızda veya eğdiğinizde bu nesneler hareket eder.
Şartlar
WebGL Overlay View'u kullanmak için vektör harita etkinleştirilmiş bir harita kimliğiyle haritayı yüklemeniz gerekir. Tam 3D kamera kontrolü için harita kimliğini oluştururken eğme ve döndürme özelliklerini etkinleştirmenizi önemle tavsiye ederiz. Ayrıntılar için genel bakış bölümüne bakın.
WebGL yer paylaşımlı görünümü ekleme
Yerleşimi haritanıza eklemek için google.maps.WebGLOverlayView
işlevini uygulayın, ardından setMap
kullanarak harita örneğinizi iletin:
// 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);
Yaşam döngüsü kancaları
WebGL yer paylaşımlı görünümü, vektör harita tabanının WebGL oluşturma bağlamının yaşam döngüsünde çeşitli zamanlarda çağrılan bir dizi kanca sağlar. Bu yaşam döngüsü kancaları, yer paylaşımında oluşturulmasını istediğiniz her şeyi ayarladığınız, çizdiğiniz ve kaldırdığınız yerlerdir.
- Yer paylaşımı oluşturulduğunda
onAdd()
çağrılır. Bu işlevi, kaplama çizilmeden önce ara veri yapılarını getirmek veya oluşturmak için kullanın. Bu veri yapıları, WebGL oluşturma bağlamına anında erişim gerektirmez. onContextRestored({gl})
, oluşturma bağlamı kullanılabilir hale geldiğinde bir kez çağrılır. Shader'lar, GL arabellek nesneleri gibi tüm WebGL durumlarını başlatmak veya bağlamak için kullanılır.onContextRestored()
, tek bir alanı olan birWebGLStateOptions
örneği alır:gl
, temel harita tarafından kullanılanWebGLRenderingContext
için bir tutamaktır.
onDraw({gl, transformer})
, temel haritadaki sahneyi oluşturur.onDraw()
parametreleri, iki alanı olan birWebGLDrawOptions
nesnesidir:gl
, temel harita tarafından kullanılanWebGLRenderingContext
için bir tutamaktır.transformer
, harita koordinatlarından model-görünüm-projeksiyon matrisine dönüştürmek için yardımcı işlevler sağlar. Bu işlevler, harita koordinatlarını dünya alanına, kamera alanına ve ekran alanına çevirmek için kullanılabilir.
onContextLost()
, oluşturma bağlamı herhangi bir nedenle kaybolduğunda çağrılır ve artık gerekli olmadığından önceden var olan tüm GL durumunu temizlemeniz gereken yerdir.onStateUpdate({gl})
, GL durumunu oluşturma döngüsünün dışında günceller verequestStateUpdate
çağrıldığında etkinleştirilir. Tek bir alanı olanWebGLStateOptions
örneğini alır:gl
, temel harita tarafından kullanılanWebGLRenderingContext
için bir tutamaktır.
onRemove()
, yer paylaşımıWebGLOverlayView.setMap(null)
ile haritadan kaldırıldığında çağrılır ve tüm ara nesneleri kaldırmanız gereken yerdir.
Örneğin, aşağıda tüm yaşam döngüsü kancalarının temel bir uygulaması verilmiştir:
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);
GL durumunu sıfırlama
WebGL Yer Paylaşımlı Görünüm, temel haritanın WebGL oluşturma bağlamını gösterir. Bu nedenle, nesneleri oluşturmayı tamamladığınızda GL durumunu orijinal durumuna sıfırlamanız son derece önemlidir. GL durumunun sıfırlanmaması, GL durumu çakışmalarına yol açabilir. Bu da hem haritanın hem de belirttiğiniz nesnelerin oluşturulmasının başarısız olmasına neden olur.
GL durumunu sıfırlama işlemi normalde onDraw()
kancasında gerçekleştirilir. Örneğin,
Three.js, GL durumundaki değişiklikleri temizleyen bir yardımcı işlev sağlar:
webglOverlayView.onDraw = ({gl, transformer}) => {
// Specify an object to render.
renderer.render(scene, camera);
renderer.resetState();
}
Harita veya nesneleriniz oluşturulmuyorsa bunun nedeni büyük olasılıkla GL durumunun sıfırlanmamış olmasıdır.
Koordinat Dönüşümleri
Vektör haritasındaki bir nesnenin konumu, enlem ve boylam koordinatlarının yanı sıra rakım kombinasyonu sağlanarak belirtilir. Ancak 3D grafikler, dünya alanı, kamera alanı veya ekran alanında belirtilir.
Harita koordinatlarını bu daha yaygın kullanılan alanlara dönüştürmeyi kolaylaştırmak için WebGL Yer Paylaşımlı Görünüm, aşağıdaki değerleri alan ve Float64Array
döndüren coordinateTransformer.fromLatLngAltitude(latLngAltitude, rotationArr,
scalarArr)
yardımcı işlevini onDraw()
kancasında sağlar:
latLngAltitude
: Enlem/boylam/yükseklik koordinatlarıLatLngAltitude
veyaLatLngAltitudeLiteral
olarak.rotationArr
: Derece cinsinden belirtilen Euler dönüşü açılarınınFloat32Array
.scalarArr
: Ana eksene uygulanacakFloat32Array
ölçeklendirme faktörü.
Örneğin, aşağıda Three.js'de kamera projeksiyon matrisi oluşturmak için fromLatLngAltitude()
kullanılmıştır:
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);
Örnek
Aşağıda, popüler ve açık kaynaklı bir WebGL kitaplığı olan Three.js'yi kullanarak haritaya 3D nesne yerleştirme ile ilgili basit bir örnek verilmiştir. Bu sayfanın üst kısmında çalışan örneği oluşturmak için WebGL yer paylaşımlı görünümünü kullanma hakkında eksiksiz bir adım adım açıklamalı kılavuz için WebGL ile hızlandırılmış harita deneyimleri oluşturma codelab'ini deneyin.
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);