跳到主要内容
版本:9.3.0

标注三维模型

支持对三维模型进行文字标注。

show
<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8" />
<title>为3D模型添加标注</title>
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
<style>
body {
margin: 0;
padding: 0;
}

#map {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
color: #e4dada;
}

#div_roof {
position: absolute;
color: #000000;
font-weight: 600;
display: none;
transform: translate(-50%, -50%);
}
</style>
<script src="https://delivery.mapmost.com/cdn/sdk/webgl/v9.3.0/mapmost-webgl-min.js"></script>
</head>

<body>
<div id="map"></div>
<div id="div_roof">东方之门</div>
<script>
let divRoof = document.getElementById("div_roof");
let group, intersectCube;
let halfWidth = window.innerWidth / 2,
halfHeight = window.innerHeight / 2;
let box, centerVector;

let map = new mapmost.Map({
container: 'map',
style: "<your style url>",
center: [120.67727020663829, 31.31997024841401],
zoom: 14.907143631939364,
pitch: 59.48725112156901,
bearing: -54.10626584095007,
userId: '***', // 授权码
env3D: {
defaultLight: true,
exposure: 2.8,
envMap: '../example_data/hdr/WhiteBG_Ref_1K.hdr'
}
});
map.on('load', function () {

let models_obj = ["../jinji_plaza_eastern_door_building.glb"].map(item => ({
type: 'glb',
url: item
}));
let options = {
id: 'model_id',
type: 'model',
models: models_obj,
center: [120.67727020663829, 31.31997024841401],
transPosition(position, MoveUpY) {
// 世界坐标->标准坐标->屏幕坐标
let world_vector = new mapmost.THREE.Vector3(position.x, position.y, position.z); // 表示世界坐标
let vector = world_vector.project(camera);// 世界坐标转为标准坐标
if (MoveUpY) { vector.add(MoveUpY) }
return {
x: Math.round(vector.x * halfWidth + halfWidth),// 标准坐标转为屏幕坐标
y: Math.round(-vector.y * halfHeight + halfHeight)
};
},
funcRender: function () {
if (group) {
divRoof.style.display = 'block'
let roofCoordinate = this.transPosition(intersectCube.getWorldPosition(new mapmost.THREE.Vector3()))
divRoof.style.left = roofCoordinate.x + "px";
divRoof.style.top = roofCoordinate.y + "px";
}
},
callback: (function (group1, layer) {
group = group1;

box = new mapmost.THREE.Box3();
box.expandByObject(group.children[0].clone())
centerVector = new mapmost.THREE.Vector3()
box.getCenter(centerVector)
// 新建一个Mesh
let intersectGeo = new mapmost.THREE.BoxGeometry(10, 10, 1);
// 设为透明
let intersectMaterial = new mapmost.THREE.MeshLambertMaterial({ color: "red", transparent: true, opacity: '0' });

intersectCube = new mapmost.THREE.Mesh(intersectGeo, intersectMaterial);
// (以几何体中心的x和y用包围盒的最大的点的z+50) 来设置Mesh的位置
intersectCube.position.set(centerVector.x, centerVector.y, box.max.z + 50)

group.add(intersectCube);
camera = layer.tb.camera;
}),
};
map.addLayer(options);

})
</script>
</body>

</html>