


When Vue and Mapbox combine Three.js, how do you ensure that the bottom of a 3D object is fixed on the map without changing with the perspective?
Implement perfect synchronization of 3D models and map viewing in Vue, Mapbox and Three.js
This article discusses how to combine Mapbox GL JS and Three.js in Vue.js application to achieve the effect of keeping the bottom fixed on the map when the map view angle changes. This is crucial for building 3D visualization applications based on geolocation.
Challenge: Change in perspective causes model shift
A common problem when overlaying Three.js models on Mapbox maps is that when you drag or zoom the map, the bottom of the model is offset instead of staying fixed on the map coordinates. This is different from using glTF models directly, which usually better maintain relative position to the map.
Solution: Accurate coordinate transformation and model positioning
Solving this problem requires precise coordinate transformation and model positioning strategies. The following steps and code examples will help you achieve your goals:
Correctness of coordinate system conversion: Make sure your coordinate conversion function (such as
calculatemodeltransform
) correctly converts the 3D model coordinates to the Mercator projection coordinate system used by Mapbox.Adjustment of model position and scaling: The key is to adjust the position and scaling of the Three.js model so that its bottom always corresponds to the map coordinates. The following code snippet shows how to modify the
createcustomlayer
function:
createCustomLayer(index, point, modelTransform) { let color; let altitude; // Set the color and height according to the PM2.5 value (assuming this logic already exists) // ... const customLayer = { id: `custom-layer-${index}`, type: 'custom', renderingMode: '3d', onAdd: (map, gl) => { console.log(`Custom layer added: ${customLayer.id}`); customLayer.camera = new THREE.Camera(); customLayer.scene = new THREE.Scene(); // Add light (ambient and directional light) // ... (assuming this logic already exists) const geometry = new THREE.BoxGeometry(20, altitude, 20); // Adjust the size const material = new THREE.MeshStandardMaterial({ color: color, transparent: true, opacity: 0.8 }); const cube = new THREE.Mesh(geometry, material); // Add contour lines (assuming this logic already exists) // ... // **Key steps: Adjust the position of the model so that the bottom of it is fixed to the map** cube.position.set(0, altitude / 2, 0); //The bottom is located at (0,0,0) customLayer.scene.add(cube); customLayer.map = map; customLayer.renderer = new THREE.WebGLRenderer({ canvas: map.getCanvas(), context: gl, antialias: true }); customLayer.renderer.autoClear = false; }, render: (gl, matrix) => { console.log(`Custom layer rendering: ${customLayer.id}`); const m = new THREE.Matrix4().fromArray(matrix); // ... (Computation of the model transformation matrix, assuming this logic already exists) customLayer.camera.projectionMatrix = m.multiply(l); customLayer.renderer.resetState(); customLayer.renderer.render(customLayer.scene, customLayer.camera); customLayer.map.triggerRepaint(); } }; return customLayer; }
In the code, cube.position.set(0, altitude / 2, 0);
make sure the bottom of the cube is at (0,0,0), and then adjust the height according to altitude
. This allows the bottom of the model to always align with the map coordinate system origin.
- Test and fine-tune: After completing the code modification, test your application and verify that the bottom of the model is always fixed on the map by dragging and zooming the map. It may need to be fine-tuned based on your specific coordinate transformation and model structure.
Through the above steps, you can effectively solve the problem of the Three.js model offset when the map view angle changes, thereby building a more stable and accurate three-dimensional geographic information visualization application. Remember, the key lies in precise coordinate transformation and relative position adjustment of the model.
The above is the detailed content of When Vue and Mapbox combine Three.js, how do you ensure that the bottom of a 3D object is fixed on the map without changing with the perspective?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











The top ten cryptocurrency exchanges in the world in 2025 include Binance, OKX, Gate.io, Coinbase, Kraken, Huobi, Bitfinex, KuCoin, Bittrex and Poloniex, all of which are known for their high trading volume and security.

Bitcoin’s price ranges from $20,000 to $30,000. 1. Bitcoin’s price has fluctuated dramatically since 2009, reaching nearly $20,000 in 2017 and nearly $60,000 in 2021. 2. Prices are affected by factors such as market demand, supply, and macroeconomic environment. 3. Get real-time prices through exchanges, mobile apps and websites. 4. Bitcoin price is highly volatile, driven by market sentiment and external factors. 5. It has a certain relationship with traditional financial markets and is affected by global stock markets, the strength of the US dollar, etc. 6. The long-term trend is bullish, but risks need to be assessed with caution.

The top ten cryptocurrency trading platforms in the world include Binance, OKX, Gate.io, Coinbase, Kraken, Huobi Global, Bitfinex, Bittrex, KuCoin and Poloniex, all of which provide a variety of trading methods and powerful security measures.

MeMebox 2.0 redefines crypto asset management through innovative architecture and performance breakthroughs. 1) It solves three major pain points: asset silos, income decay and paradox of security and convenience. 2) Through intelligent asset hubs, dynamic risk management and return enhancement engines, cross-chain transfer speed, average yield rate and security incident response speed are improved. 3) Provide users with asset visualization, policy automation and governance integration, realizing user value reconstruction. 4) Through ecological collaboration and compliance innovation, the overall effectiveness of the platform has been enhanced. 5) In the future, smart contract insurance pools, forecast market integration and AI-driven asset allocation will be launched to continue to lead the development of the industry.

Currently ranked among the top ten virtual currency exchanges: 1. Binance, 2. OKX, 3. Gate.io, 4. Coin library, 5. Siren, 6. Huobi Global Station, 7. Bybit, 8. Kucoin, 9. Bitcoin, 10. bit stamp.

The top ten digital currency exchanges such as Binance, OKX, gate.io have improved their systems, efficient diversified transactions and strict security measures.

Using the chrono library in C can allow you to control time and time intervals more accurately. Let's explore the charm of this library. C's chrono library is part of the standard library, which provides a modern way to deal with time and time intervals. For programmers who have suffered from time.h and ctime, chrono is undoubtedly a boon. It not only improves the readability and maintainability of the code, but also provides higher accuracy and flexibility. Let's start with the basics. The chrono library mainly includes the following key components: std::chrono::system_clock: represents the system clock, used to obtain the current time. std::chron

Handling high DPI display in C can be achieved through the following steps: 1) Understand DPI and scaling, use the operating system API to obtain DPI information and adjust the graphics output; 2) Handle cross-platform compatibility, use cross-platform graphics libraries such as SDL or Qt; 3) Perform performance optimization, improve performance through cache, hardware acceleration, and dynamic adjustment of the details level; 4) Solve common problems, such as blurred text and interface elements are too small, and solve by correctly applying DPI scaling.
