准备
three.js
mapbox-gl.js
mapbox-gl.css
threebox.js
DEMO
<!doctype html>
<head>
<title>Threebox example</title>
<script src="../dist/threebox.js" type="text/javascript"></script>
<script src='mapbox-gl.js'></script>
<link href='mapbox-gl.css' rel='stylesheet' />
<style>
body, html {
width: 100%;
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id='map' class='map'></div>
<script>
mapboxgl.accessToken = 'pk.eyJ1Ijoia3JvbmljayIsImEiOiJjaWxyZGZwcHQwOHRidWxrbnd0OTB0cDBzIn0.u2R3NY5PnevWH3cHRk6TWQ';
var map = new mapboxgl.Map({
container: 'map',
style: 'https://raw.githubusercontent.com/osm2vectortiles/mapbox-gl-styles/master/styles/bright-v9-cdn.json',
center: [-122.4340, 37.7353],
zoom: 8.55,
pitch: 60,
heading: 41,
hash: true
});
var highlighted = [];
map.on("load", function() {
// Initialize threebox
window.threebox = new Threebox(map);
threebox.setupDefaultLights();
// initialize geometry and material of our cube object
var lng = -122.4340;
var lat = 37.7353;
for(x=1;x<10;x++){
for(y=1;y<=10;y++){
//new THREE.BoxGeometry(500, 500, 0);
var geometry = new THREE.CylinderGeometry(5,5,60,64,1,false);
var greenMaterial = new THREE.MeshPhongMaterial( {color: 0xaaffaa, side: THREE.DoubleSide});
var redMaterial = new THREE.MeshPhongMaterial( {color: 0xff0000, side: THREE.DoubleSide});
var cube = new THREE.Mesh(geometry, redMaterial);
cube.rotation.x += 1.5;
cube.userData.name = "Red cube";
threebox.addAtCoordinate(cube, [-122.4340 + (x/1000), 37.7353 + (y/1000), 0], {preScale: 1});
}
}
//add mousing interactions
map.on('mousemove', function(e){
raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
// Clear old objects
highlighted.forEach(function(h) {
h.material = redMaterial;
});
highlighted.length = 0;
// scale mouse pixel position to a percentage of the screen's width and height
mouse.x = ( e.point.x / threebox.map.transform.width ) * 2 - 1;
mouse.y = -( ( e.point.y) / threebox.map.transform.height ) * 2 + 1;
raycaster.setFromCamera(mouse, threebox.camera);
// calculate objects intersecting the picking ray
var intersects = raycaster.intersectObjects(threebox.world.children, true);
if (!intersects[0]) return
var nearestObject = intersects[0].object;
//console.log(nearestObject);
nearestObject.material = greenMaterial;
highlighted.push(nearestObject)
});
});
</script>
</body>
效果

原理
mapbox gl基本保持不变,通过threebox来进行对thee js的转换,使其能够把场景scene、相机camera转换同步到mapbox gl引擎中,各自渲染render不变,互补影响
来源:https://www.cnblogs.com/lilei2blog/p/8622473.html