Cesium-Examples/examples/cesiumEx/9.1.3、Primitive_triangles_笛卡尔坐标.html

127 lines
11 KiB
HTML
Raw Normal View History

2025-10-20 09:56:15 +00:00
<!--********************************************************************
* 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>