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 kapatma 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 de 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 haritası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 WebGL oluşturma bağlamına anında erişim gerektirmeyen ara veri yapılarını getirmek veya oluşturmak için kullanın. onContextRestored({gl}), oluşturma bağlamı kullanılabilir hale geldiğinde bir kez çağrılır. Shader'lar, GL arabellek nesneleri gibi WebGL durumlarını başlatmak veya bağlamak için kullanın.onContextRestored(), tek bir alanı olanWebGLStateOptionsörneğini alır:gl, temel harita tarafından kullanılanWebGLRenderingContextiçin bir tutamaktır.
onDraw({gl, transformer}), sahneyi temel haritada oluşturur.onDraw()parametreleri, iki alanı olan birWebGLDrawOptionsnesnesidir:gl, temel harita tarafından kullanılanWebGLRenderingContextiçin bir tutamaktır.transformer, harita koordinatlarını dünya uzayına, kamera uzayına ve ekran uzayına çevirmek için kullanılabilen model-görünüm-projeksiyon matrisine dönüştürmek için yardımcı işlevler sağlar.
onContextLost(), oluşturma bağlamı herhangi bir nedenle kaybolduğunda çağrılır ve artık gerekli olmadığından önceden var olan 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ılanWebGLRenderingContextiç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şturma işlemini 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 yapılır. Ö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
Bir nesnenin vektör haritasındaki konumu, enlem ve boylam koordinatlarının yanı sıra yüksekliğin bir kombinasyonu sağlanarak belirtilir. 3D grafikler ise dünya uzayında, kamera uzayında veya ekran uzayı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, onDraw() kancasında aşağıdaki değerleri alan ve Float64Array döndüren coordinateTransformer.fromLatLngAltitude(latLngAltitude, rotationArr,
scalarArr) yardımcı işlevini sağlar:
latLngAltitude: Enlem/boylam/yükseklik koordinatlarıLatLngAltitudeveyaLatLngAltitudeLiteralolarak.rotationArr: Derece cinsinden belirtilen Euler dönüşü açılarınınFloat32Array.scalarArr: Ana eksene uygulanacakFloat32Arrayölçeklendirme faktörü.
Örneğin, aşağıdaki örnekte Three.js'de bir kamera projeksiyon matrisi oluşturmak için fromLatLngAltitude() kullanılı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çıklama 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);