WebGL 疊加層檢視
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
查看範例
您可以透過 WebGL 疊加層檢視,直接使用 WebGL 或常用圖形程式庫 (例如 Three.js) 在地圖上新增內容。運用 WebGL 疊加層檢視,即可直接存取 Google 地圖平台算繪向量基本地圖的環境。共用算繪環境有許多好處,包括運用 3D 建築物幾何圖形進行深度遮蔽,及同步處理 2D/3D 內容與基本地圖算繪。透過 WebGL 疊加層檢視算繪的物件也可以與經緯度座標建立關聯,因此當您拖曳、縮放、平移或傾斜地圖時,這些物件會隨之移動。
需求條件
如要使用 WebGL 疊加層檢視,請透過已啟用向量地圖的地圖 ID 載入地圖。強烈建議您在建立地圖 ID 時啟用傾斜和旋轉,即可使用完整的 3D 攝影機控制功能。詳情請參閱總覽。
新增 WebGL 疊加層檢視
如要將疊加層加入地圖,請導入 google.maps.WebGLOverlayView
,然後使用 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);
生命週期掛鉤
WebGL 疊加層檢視提供一組掛鉤,可在向量基本地圖 WebGL 算繪環境生命週期中的不同時間點呼叫。在這些生命週期掛鉤中,您可以設定、繪製及拆解要在疊加層中算繪的任何內容。
- 建立疊加層後,系統會呼叫
onAdd()
。在繪製疊加層前,請使用此方法擷取或建立中繼資料結構,不需要立即存取 WebGL 算繪環境。
- 算繪環境可供使用時,系統會呼叫
onContextRestored({gl})
。可用來初始化或繫結任何 WebGL 狀態,例如著色器、GL 緩衝區物件等。onContextRestored()
會採用 WebGLStateOptions
執行個體,其中包含單一欄位:
gl
是基本地圖使用的 WebGLRenderingContext
控制代碼。
onDraw({gl, transformer})
會在基本地圖上算繪場景。onDraw()
的參數是 WebGLDrawOptions
物件,其中包含兩個欄位:
gl
是基本地圖使用的 WebGLRenderingContext
控制代碼。
transformer
提供輔助函式,能把地圖座標轉換為模型檢視投影矩陣。您可以使用此函式將地圖座標轉譯為世界空間、攝影機空間和螢幕空間。
- 如有任何因素造成算繪環境遺失,系統會呼叫
onContextLost()
,其中任何既有的 GL 狀態都不再需要使用,請加以清除。
onStateUpdate({gl})
會更新算繪迴圈外的 GL 狀態,並在呼叫 requestStateUpdate
時加以叫用。這會採用 WebGLStateOptions
執行個體,其中包含單一欄位:
gl
是基本地圖使用的 WebGLRenderingContext
控制代碼。
- 使用
WebGLOverlayView.setMap(null)
從地圖中移除疊加層時,系統會呼叫 onRemove()
,請務必移除其中的所有中繼物件。
舉例來說,以下是所有生命週期掛鉤的基本實作方式:
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 狀態
WebGL 疊加層檢視可顯示基本地圖的 WebGL 算繪環境。因此,完成算繪物件時,請務必將 GL 狀態重設為原始狀態。如未能重設 GL 狀態,可能會導致 GL 狀態衝突,造成地圖和您指定的任何物件算繪失敗。
GL 狀態重設通常會在 onDraw()
掛鉤中處理。例如,Three.js 提供的輔助函式會清除 GL 狀態的任何變更:
webglOverlayView.onDraw = ({gl, transformer}) => {
// Specify an object to render.
renderer.render(scene, camera);
renderer.resetState();
}
如果地圖或物件無法算繪,很可能表示 GL 狀態尚未重設。
提供經緯度座標的組合以及海拔高度,即可指定物件在向量地圖上的位置。不過,3D 圖形是在世界空間、攝影機空間或螢幕空間中指定。為方便將地圖座標轉換為更常用的空間,WebGL 疊加層檢視會在 onDraw()
掛鉤中提供 coordinateTransformer.fromLatLngAltitude(latLngAltitude, rotationArr,
scalarArr)
輔助函式,該掛鉤會使用下列項目並傳回 Float64Array
:
latLngAltitude
:緯度/經度/海拔高度座標,格式為 LatLngAltitude
或 LatLngAltitudeLiteral
。
rotationArr
:Float32Array
的歐拉旋轉角度 (以度為單位)。
scalarArr
:要套用至基軸的純量 Float32Array
。
例如,以下程式碼使用 fromLatLngAltitude()
在 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);
範例
以下簡單示範如何使用 Three.js (常用開放原始碼 WebGL 程式庫) 在地圖上放置 3D 物件。若想瞭解如何使用 WebGL 疊加層檢視建立本頁上方的範例,請到程式碼研究室:打造採用 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);
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-08-31 (世界標準時間)。
[null,null,["上次更新時間:2025-08-31 (世界標準時間)。"],[[["\u003cp\u003eWebGL Overlay View empowers you to seamlessly integrate 3D and 2D content into Google Maps using WebGL directly or via libraries like Three.js, leveraging the same rendering context for synchronized visuals and depth occlusion with buildings.\u003c/p\u003e\n"],["\u003cp\u003eIt's crucial to load the map with a vector map enabled map ID, ideally with tilt and rotation activated, to fully utilize 3D camera control and functionalities.\u003c/p\u003e\n"],["\u003cp\u003eWebGL Overlay View offers lifecycle hooks like \u003ccode\u003eonAdd\u003c/code\u003e, \u003ccode\u003eonContextRestored\u003c/code\u003e, \u003ccode\u003eonDraw\u003c/code\u003e, \u003ccode\u003eonContextLost\u003c/code\u003e, \u003ccode\u003eonStateUpdate\u003c/code\u003e, and \u003ccode\u003eonRemove\u003c/code\u003e, providing control over setup, rendering, and teardown of your overlay elements.\u003c/p\u003e\n"],["\u003cp\u003eRemember to reset the GL state after rendering using methods like \u003ccode\u003erenderer.resetState()\u003c/code\u003e (Three.js) to avoid rendering conflicts and ensure proper functionality.\u003c/p\u003e\n"],["\u003cp\u003eUtilize the \u003ccode\u003ecoordinateTransformer.fromLatLngAltitude()\u003c/code\u003e helper function within \u003ccode\u003eonDraw\u003c/code\u003e to transform latitude/longitude/altitude coordinates to world/camera/screen space for accurate object placement and georeferencing.\u003c/p\u003e\n"]]],[],null,["# WebGL Overlay View\n\n\u003cbr /\u003e\n\n\n[View Sample](/maps/documentation/javascript/examples/webgl/webgl-overlay-simple)\n\nWith WebGL Overlay View you can add content to your maps using WebGL directly,\nor popular Graphics libraries like Three.js. WebGL Overlay View provides direct\naccess to the same WebGL rendering context Google Maps Platform uses to render\nthe vector basemap. This use of a shared rendering context provides benefits\nsuch as depth occlusion with 3D building geometry, and the ability to sync 2D/3D\ncontent with basemap rendering. Objects rendered with the WebGL Overlay View can\nalso be tied to latitude/longitude coordinates, so they move when you drag,\nzoom, pan, or tilt the map.\n\nRequirements\n------------\n\nTo use WebGL Overlay View, you must load the map using a map ID with the vector\nmap enabled. We strongly recommend enabling tilt and rotation when you create\nthe map ID, to allow for full 3D camera control.\n[See the overview for details](/maps/documentation/javascript/webgl).\n\nAdd WebGL Overlay View\n----------------------\n\nTo add the overlay to your map, implement `google.maps.WebGLOverlayView`, then\npass it your map instance using `setMap`: \n\n // Create a map instance.\n const map = new google.maps.Map(mapDiv, mapOptions);\n\n // Create a WebGL Overlay View instance.\n const webglOverlayView = new google.maps.WebGLOverlayView();\n\n // Add the overlay to the map.\n webglOverlayView.setMap(map);\n\nLifecycle hooks\n---------------\n\nWebGL Overlay View provides a set of hooks that are called at various times in\nthe lifecycle of the WebGL rendering context of the vector basemap. These\nlifecycle hooks are where you setup, draw, and tear down anything you want\nrendered in the overlay.\n\n- **`onAdd()`** is called when the overlay is created. Use it to fetch or create intermediate data structures before the overlay is drawn that don't require immediate access to the WebGL rendering context.\n- **`onContextRestored({gl})`** is called once the rendering context is available. Use it to initialize or bind any WebGL state such as shaders, GL buffer objects, and so on. `onContextRestored()` takes a `WebGLStateOptions` instance, which has a single field:\n - `gl` is a handle to the `WebGLRenderingContext` used by the basemap.\n- **`onDraw({gl, transformer})`** renders the scene on the basemap. The parameters for `onDraw()` is a `WebGLDrawOptions` object, which has two fields:\n - `gl` is a handle to the `WebGLRenderingContext` used by the basemap.\n - `transformer` provides helper functions to transform from map coordinates to model-view-projection matrix, which can be used to translate map coordinates to world space, camera space, and screen space.\n- **`onContextLost()`** is called when the rendering context is lost for any reason, and is where you should clean up any pre-existing GL state, since it is no longer needed.\n- **`onStateUpdate({gl})`** updates the GL state outside of the render loop, and is invoked when `requestStateUpdate` is called. It takes a `WebGLStateOptions` instance, which has a single field:\n - `gl` is a handle to the `WebGLRenderingContext` used by the basemap.\n- **`onRemove()`** is called when the overlay is removed from the map with `WebGLOverlayView.setMap(null)`, and is where you should remove all intermediate objects.\n\nFor example, the following is a basic implementation of all lifecycle hooks: \n\n const webglOverlayView = new google.maps.WebGLOverlayView();\n\n webglOverlayView.onAdd = () =\u003e {\n // Do setup that does not require access to rendering context.\n }\n\n webglOverlayView.onContextRestored = ({gl}) =\u003e {\n // Do setup that requires access to rendering context before onDraw call.\n }\n\n webglOverlayView.onStateUpdate = ({gl}) =\u003e {\n // Do GL state setup or updates outside of the render loop.\n }\n\n webglOverlayView.onDraw = ({gl, transformer}) =\u003e {\n // Render objects.\n }\n\n webglOverlayView.onContextLost = () =\u003e {\n // Clean up pre-existing GL state.\n }\n\n webglOverlayView.onRemove = () =\u003e {\n // Remove all intermediate objects.\n }\n\n webglOverlayView.setMap(map);\n\nResetting GL State\n------------------\n\nWebGL Overlay View exposes the WebGL rendering context of the basemap. Because\nof this, it is extremely important that you reset the GL state to its original\nstate when you are done rendering objects. Failure to reset the GL state is\nlikely to result in GL state conflicts, which will cause rendering of both the\nmap and any objects you specify to fail.\n\nResetting the GL state is normally handled in the `onDraw()` hook. For example,\nThree.js provides a helper function that clears any changes to the GL state: \n\n webglOverlayView.onDraw = ({gl, transformer}) =\u003e {\n // Specify an object to render.\n renderer.render(scene, camera);\n renderer.resetState();\n }\n\nIf the map or your objects fail to render, it is very likely that the GL state\nhas not been reset.\n\nCoordinate Transformations\n--------------------------\n\nThe position of an object on the vector map is specified by providing a\ncombination of latitude and longitude coordinates, as well as altitude. 3D\ngraphics, however, are specified in world space, camera space, or screen space.\nTo make it easier to transform map coordinates to these more commonly used\nspaces, WebGL Overlay View provides the\n`coordinateTransformer.fromLatLngAltitude(latLngAltitude, rotationArr,\nscalarArr)` helper function in the `onDraw()` hook that takes the following and\nreturns a `Float64Array`:\n\n- `latLngAltitude`: Latitude/longitude/altitude coordinates either as a `LatLngAltitude` or `LatLngAltitudeLiteral`.\n- `rotationArr`: `Float32Array` of euler rotation angles specified in degrees.\n- `scalarArr`: `Float32Array` of scalars to apply to the cardinal axis.\n\nFor example, the following uses `fromLatLngAltitude()` to create a camera\nprojection matrix in Three.js: \n\n const camera = new THREE.PerspectiveCamera();\n const matrix = coordinateTransformer.fromLatLngAltitude({\n lat: mapOptions.center.lat,\n lng: mapOptions.center.lng,\n altitude: 120,\n });\n camera.projectionMatrix = new THREE.Matrix4().fromArray(matrix);\n\nExample\n-------\n\nThe following is a simple example of using [Three.js](https://threejs.org), a\npopular, open source WebGL library, to place a 3D object on the map. For a\ncomplete walkthrough of using WebGL Overlay View to build the example you see\nrunning at the top of this page, try the\n[Building WebGL-accelerated Map Experiences codelab](http://goo.gle/maps-platform-webgl-codelab). \n\n const webglOverlayView = new google.maps.WebGLOverlayView();\n let scene, renderer, camera, loader;\n\n webglOverlayView.onAdd = () =\u003e {\n // Set up the Three.js scene.\n scene = new THREE.Scene();\n camera = new THREE.PerspectiveCamera();\n const ambientLight = new THREE.AmbientLight( 0xffffff, 0.75 ); // Soft white light.\n scene.add(ambientLight);\n\n // Load the 3D model with GLTF Loader from Three.js.\n loader = new GLTFLoader();\n loader.load(\"pin.gltf\");\n }\n\n webglOverlayView.onContextRestored = ({gl}) =\u003e {\n // Create the Three.js renderer, using the\n // maps's WebGL rendering context.\n renderer = new THREE.WebGLRenderer({\n canvas: gl.canvas,\n context: gl,\n ...gl.getContextAttributes(),\n });\n renderer.autoClear = false;\n }\n\n webglOverlayView.onDraw = ({gl, transformer}) =\u003e {\n // Update camera matrix to ensure the model is georeferenced correctly on the map.\n const matrix = transformer.fromLatLngAltitude({\n lat: mapOptions.center.lat,\n lng: mapOptions.center.lng,\n altitude: 120,\n });\n camera.projectionMatrix = new THREE.Matrix4().fromArray(matrix);\n\n // Request a redraw and render the scene.\n webglOverlayView.requestRedraw();\n renderer.render(scene, camera);\n\n // Always reset the GL state.\n renderer.resetState();\n }\n\n // Add the overlay to the map.\n webglOverlayView.setMap(map);"]]