WebGL yer paylaşımlı görünümü sayesinde doğrudan WebGL'yi veya Three.js gibi popüler grafik kitaplıklarını kullanarak haritalara içerik ekleyebilirsiniz. WebGL yer paylaşımı görünümü, 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 geometrisi ile derinlik kapama ve 2D/3D içeriği temel harita oluşturma ile senkronize etme gibi avantajlar sağlar. WebGL Yer paylaşımı görünümüyle oluşturulan nesneler, enlem/boylam koordinatlarına da bağlanabilir. Böylece, haritayı sürüklediğinizde, yakınlaştırdığınızda, kaydırdığınızda veya yatırdığınızda hareket ederler.
Şartlar
WebGL yer paylaşımı görünümünü kullanmak için haritayı, vektör haritanın etkin olduğu bir harita kimliği kullanarak yüklemeniz gerekir. Tam 3D kamera kontrolü için harita kimliğini oluştururken eğilme ve döndürme özelliğini 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
'ü uygulayın, ardından setMap
kullanarak harita örneğinize 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 ana haritanı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 yerdir.
- Yer paylaşımı oluşturulduğunda
onAdd()
çağrılır. Yer paylaşımı çizilmeden önce WebGL oluşturma bağlamına anında erişim gerektirmeyen ara veri yapılarını almak veya oluşturmak için kullanın. - Oluşturma bağlamı kullanılabilir hale geldiğinde
onContextRestored({gl})
çağrılır. Gölgelendiriciler ve GL arabellek nesneleri gibi WebGL durumlarını başlatmak veya bağlamak için bunu kullanın.onContextRestored()
, tek bir alanı olanWebGLStateOptions
örneğini alır:gl
, temel harita tarafından kullanılanWebGLRenderingContext
öğesinin herkese açık kullanıcı adıdır.
onDraw({gl, transformer})
, temel haritadaki sahneyi oluşturur.onDraw()
parametreleri, iki alanı olan birWebGLDrawOptions
nesnesidir:gl
, temel harita tarafından kullanılanWebGLRenderingContext
öğesinin herkese açık kullanıcı adıdır.transformer
, harita koordinatlarını dünya uzayına, kamera uzayına ve ekran uzayına dönüştürmek için kullanılabilecek harita koordinatlarından model-görüntü-projeksiyon matrisine dönüştürme yardımcı işlevleri sağlar.
onContextLost()
, oluşturma bağlamı herhangi bir nedenle kaybedildiğinde çağrılır ve artık gerekli olmadığı için ö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 çağrılır. Tek bir alanı olan birWebGLStateOptions
örneği alır:gl
, temel harita tarafından kullanılanWebGLRenderingContext
öğesinin herkese açık kullanıcı adıdır.
- Yer paylaşımı
WebGLOverlayView.setMap(null)
ile haritadan kaldırıldığındaonRemove()
çağrılır ve tüm ara nesneleri buradan kaldırmanız gerekir.
Örneğin, aşağıda tüm yaşam döngüsü kancalarının temel bir uygulaması gösterilmektedir:
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 neden olabilir. Bu da hem haritanın hem de belirttiğiniz nesnelerin oluşturulmamasına yol açar.
GL durumunun sıfırlanması genellikle onDraw()
kancasında işlenir. Örneğin, Three.js, GL durumundaki tüm 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şturulamıyorsa GL durumunun sıfırlanmamış olması muhtemeldir.
Koordinat Dönüşümleri
Bir nesnenin vektör haritasındaki konumu, enlem ve boylam koordinatlarının yanı sıra rakımın bir kombinasyonu sağlanarak belirtilir. Ancak 3D grafikler dünya uzayı, kamera alanı veya ekran alanında belirtilir.
WebGL yer paylaşımlı görünüm, harita koordinatlarını daha yaygın kullanılan bu alanlara dönüştürmeyi kolaylaştırmak için onDraw()
kancasında aşağıdakileri alan ve bir Float64Array
döndüren coordinateTransformer.fromLatLngAltitude(latLngAltitude, rotationArr,
scalarArr)
yardımcı işlevini sağlar:
latLngAltitude
:LatLngAltitude
veyaLatLngAltitudeLiteral
olarak enlem/boylam/yükseklik koordinatları.rotationArr
: Derece cinsinden belirtilenFloat32Array
Euler dönme açısı.scalarArr
: Kardinal eksene uygulanacakFloat32Array
skaler.
Örneğin, aşağıdaki kodda Three.js'de kamera projeksiyon matrisi oluşturmak için fromLatLngAltitude()
kullanılmaktadı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, haritaya 3D nesne yerleştirmek için popüler ve açık kaynaklı bir WebGL kitaplığı olan Three.js'in kullanıldığı basit bir örnek verilmiştir. Bu sayfanın üst kısmında gördüğünüz örneği oluşturmak için WebGL yer paylaşımlı görünümünü kullanmayla ilgili 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);