mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-11-03 00:24:17 +00:00
127 lines
11 KiB
HTML
127 lines
11 KiB
HTML
|
|
<!--********************************************************************
|
|||
|
|
* by jiawanlong
|
|||
|
|
*********************************************************************-->
|
|||
|
|
<!DOCTYPE html>
|
|||
|
|
<html>
|
|||
|
|
|
|||
|
|
<head>
|
|||
|
|
<meta charset="UTF-8" />
|
|||
|
|
<link rel="stylesheet" href="./../../libs/cesium/Cesium1.98/Widgets/widgets.css">
|
|||
|
|
<script type="text/javascript" src="./../../libs/cesium/Cesium1.98/Cesium.js"></script>
|
|||
|
|
</head>
|
|||
|
|
|
|||
|
|
<body style="margin: 0; overflow: hidden; background: #fff; width: 100%; height: 100%; position: absolute; top: 0">
|
|||
|
|
<div id="map" style="margin: 0 auto; width: 100%; height: 100%"></div>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
window.viewer = new Cesium.Viewer('map', {
|
|||
|
|
imageryProvider: false,
|
|||
|
|
baseLayerPicker: false,
|
|||
|
|
});
|
|||
|
|
var xyz = new Cesium.UrlTemplateImageryProvider({
|
|||
|
|
"credit": "安徽",
|
|||
|
|
"url": '///data.mars3d.cn/tile/img/{z}/{x}/{y}.jpg'
|
|||
|
|
})
|
|||
|
|
viewer.imageryLayers.addImageryProvider(xyz)
|
|||
|
|
|
|||
|
|
viewer.camera.setView({
|
|||
|
|
destination: new Cesium.Cartesian3(-2003945.3424044803, 4773507.038891283, 3715452.5835408773)
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
initBoxByPoint();
|
|||
|
|
|
|||
|
|
// 获取法线
|
|||
|
|
function calculateFlatNormalsForUniqueVertices(positions, indices) {
|
|||
|
|
const normals = new Float32Array(positions.length);
|
|||
|
|
|
|||
|
|
// 遍历每个三角形(每次处理3个顶点)
|
|||
|
|
for (let i = 0; i < indices.length; i += 3) {
|
|||
|
|
const idx0 = indices[i] * 3;
|
|||
|
|
const idx1 = indices[i + 1] * 3;
|
|||
|
|
const idx2 = indices[i + 2] * 3;
|
|||
|
|
|
|||
|
|
// 获取三个顶点
|
|||
|
|
const v0 = new Cesium.Cartesian3(
|
|||
|
|
positions[idx0], positions[idx0 + 1], positions[idx0 + 2]
|
|||
|
|
);
|
|||
|
|
const v1 = new Cesium.Cartesian3(
|
|||
|
|
positions[idx1], positions[idx1 + 1], positions[idx1 + 2]
|
|||
|
|
);
|
|||
|
|
const v2 = new Cesium.Cartesian3(
|
|||
|
|
positions[idx2], positions[idx2 + 1], positions[idx2 + 2]
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 计算面法线
|
|||
|
|
const edge1 = Cesium.Cartesian3.subtract(v1, v0, new Cesium.Cartesian3());
|
|||
|
|
const edge2 = Cesium.Cartesian3.subtract(v2, v0, new Cesium.Cartesian3());
|
|||
|
|
const normal = Cesium.Cartesian3.cross(edge1, edge2, new Cesium.Cartesian3());
|
|||
|
|
Cesium.Cartesian3.normalize(normal, normal);
|
|||
|
|
|
|||
|
|
// 为当前三角形的三个顶点分配相同的法线
|
|||
|
|
normals[idx0] = normal.x;
|
|||
|
|
normals[idx0 + 1] = normal.y;
|
|||
|
|
normals[idx0 + 2] = normal.z;
|
|||
|
|
|
|||
|
|
normals[idx1] = normal.x;
|
|||
|
|
normals[idx1 + 1] = normal.y;
|
|||
|
|
normals[idx1 + 2] = normal.z;
|
|||
|
|
|
|||
|
|
normals[idx2] = normal.x;
|
|||
|
|
normals[idx2 + 1] = normal.y;
|
|||
|
|
normals[idx2 + 2] = normal.z;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return normals;
|
|||
|
|
}
|
|||
|
|
function initBoxByPoint() {
|
|||
|
|
let data = [-2003945.3424044803, 4773507.038891283, 3715452.5835408773, -2004171.8367897924, 4774097.084890106, 3714578.0835560053, -2004542.2096753595, 4773946.193350379, 3714572.2005745447, -2003945.3424044803, 4773507.038891283, 3715452.5835408773, -2004542.2096753595, 4773946.193350379, 3714572.2005745447, -2004631.714509523, 4773270.00446036, 3715387.2892478365, -2003945.3424044803, 4773507.038891283, 3715452.5835408773, -2006477.844799862, 4773574.330908435, 3718277.6524704783, -2004631.714509523, 4773270.00446036, 3715387.2892478365, -2006008.4909140684, 4769972.560882526, 3718854.071208643, -2003945.3424044803, 4773507.038891283, 3715452.5835408773, -2006477.844799862, 4773574.330908435, 3718277.6524704783, -2006008.4909140684, 4769972.560882526, 3718854.071208643, -2006477.844799862, 4773574.330908435, 3718277.6524704783, -2006172.8188565937, 4770349.896287658, 3718285.2088177577, -2006008.4909140684, 4769972.560882526, 3718854.071208643, -2006172.8188565937, 4770349.896287658, 3718285.2088177577, -2008423.103866201, 4770213.024152933, 3717252.812132867, -2006008.4909140684, 4769972.560882526, 3718854.071208643, -2008423.103866201, 4770213.024152933, 3717252.812132867, -2008869.9510247037, 4769803.862714468, 3717534.485377227, -2008423.103866201, 4770213.024152933, 3717252.812132867, -2009574.201254783, 4771576.616040394, 3715066.506344073, -2008869.9510247037, 4769803.862714468, 3717534.485377227, -2008423.103866201, 4770213.024152933, 3717252.812132867, -2009092.7870780064, 4771712.772315694, 3714980.6600793265, -2009574.201254783, 4771576.616040394, 3715066.506344073, -2008423.103866201, 4770213.024152933, 3717252.812132867, -2007879.3550177275, 4773799.2068911, 3717239.239944381, -2009092.7870780064, 4771712.772315694, 3714980.6600793265, -2006172.8188565937, 4770349.896287658, 3718285.2088177577, -2007879.3550177275, 4773799.2068911, 3717239.239944381, -2008423.103866201, 4770213.024152933, 3717252.812132867, -2006172.8188565937, 4770349.896287658, 3718285.2088177577, -2006477.844799862, 4773574.330908435, 3718277.6524704783, -2007879.3550177275, 4773799.2068911, 3717239.239944381, -2006477.844799862, 4773574.330908435, 3718277.6524704783, -2005769.8956437844, 4773653.226262081, 3714287.8984415266, -2007879.3550177275, 4773799.2068911, 3717239.239944381, -2004631.714509523, 4773270.00446036, 3715387.2892478365, -2005769.8956437844, 4773653.226262081, 3714287.8984415266, -2006477.844799862, 4773574.330908435, 3718277.6524704783, -2004631.714509523, 4773270.00446036, 3715387.2892478365, -2004542.2096753595, 4773946.193350379, 3714572.2005745447, -2005769.8956437844, 4773653.226262081, 3714287.8984415266, -2004542.2096753595, 4773946.193350379, 3714572.2005745447, -2004682.816532249, 4774312.491676953, 3714029.1569458223, -2005769.8956437844, 4773653.226262081, 3714287.8984415266, -2005769.8956437844, 4773653.226262081, 3714287.8984415266, -2004682.816532249, 4774312.491676953, 3714029.1569458223, -2006081.9480042446, 4773742.278952149, 3714006.8029777, -2006445.794754688, 4773739.351211261, 3713815.3055837494, -2005769.8956437844, 4773653.226262081, 3714287.8984415266, -2006081.9480042446, 4773742.278952149, 3714006.8029777, -2006445.794754688, 4773739.351211261, 3713815.3055837494, -2007879.3550177275, 4773799.2068911, 3717239.239944381, -2005769.8956437844, 4773653.226262081, 3714287.8984415266, -2007879.3550177275, 4773799.2068911, 3717239.239944381, -2008900.4899347625, 4772474.087523398, 3714112.4482767247, -2006445.794754688, 4773739.351211261, 3713815.3055837494, -2007879.3550177275, 4773799.2068911, 3717239.239944381, -2008900.4899347625, 4772474.087523398, 3714112.4482767247, -2009092.7870780064, 4771712.772315694, 3714980.6600793265, -2009092.7870780064, 4771712.772315694, 3714980.6600793265, -2008900.4899347625, 4772474.087523398, 3714112.4482767247, -2009632.1911288982, 4772064.660800657, 3714071.0000892845, -2009092.7870780064, 4771712.772315694, 3714980.6600793265, -2009632.1911288982, 4772064.660800657, 3714071.0000892845, -2009664.5507714734, 4772006.666697331, 3714127.6225422225,
|
|||
|
|
const vertices = new Float64Array(data)
|
|||
|
|
|
|||
|
|
let indices = []
|
|||
|
|
for (let index = 0; index < data.length; index++) {
|
|||
|
|
indices.push(index)
|
|||
|
|
}
|
|||
|
|
let indicess = new Uint16Array(indices)
|
|||
|
|
|
|||
|
|
const geometry = new Cesium.Geometry({
|
|||
|
|
attributes: {
|
|||
|
|
position: new Cesium.GeometryAttribute({
|
|||
|
|
componentDatatype: Cesium.ComponentDatatype.DOUBLE,
|
|||
|
|
componentsPerAttribute: 3,
|
|||
|
|
values: vertices
|
|||
|
|
}),
|
|||
|
|
normal: new Cesium.GeometryAttribute({
|
|||
|
|
componentDatatype: Cesium.ComponentDatatype.FLOAT,
|
|||
|
|
componentsPerAttribute: 3,
|
|||
|
|
values: calculateFlatNormalsForUniqueVertices(vertices, indicess)
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
indices: indicess,
|
|||
|
|
primitiveType: Cesium.PrimitiveType.TRIANGLES,
|
|||
|
|
boundingSphere: Cesium.BoundingSphere.fromVertices(vertices)
|
|||
|
|
})
|
|||
|
|
const instance = new Cesium.GeometryInstance({
|
|||
|
|
geometry: geometry,
|
|||
|
|
})
|
|||
|
|
viewer.scene.primitives.add(new Cesium.Primitive({
|
|||
|
|
geometryInstances: instance,
|
|||
|
|
asynchronous: false, // 关闭异步
|
|||
|
|
|
|||
|
|
appearance: new Cesium.MaterialAppearance({
|
|||
|
|
material: Cesium.Material.fromType('Color', {
|
|||
|
|
color: Cesium.Color.fromCssColorString(`rgba(68,138,145, 1)`)
|
|||
|
|
}),
|
|||
|
|
faceForward: true, // 确保法线朝向正确
|
|||
|
|
}),
|
|||
|
|
asynchronous: false,
|
|||
|
|
compressVertices: false,
|
|||
|
|
}))
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
</body>
|
|||
|
|
|
|||
|
|
</html>
|