From 2800fa4f32f3900509cb4d6eefaf2bfaf54efdd7 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Mon, 21 Apr 2025 18:29:09 +0800
Subject: [PATCH] fix: 天气显示
---
src/utils/cesium/frustum/CreateFrustum.js | 486 +++++++++++++++++++++++++----------------------------
1 files changed, 233 insertions(+), 253 deletions(-)
diff --git a/src/utils/cesium/frustum/CreateFrustum.js b/src/utils/cesium/frustum/CreateFrustum.js
index 745a1ca..00a8423 100644
--- a/src/utils/cesium/frustum/CreateFrustum.js
+++ b/src/utils/cesium/frustum/CreateFrustum.js
@@ -1,275 +1,255 @@
// * 创建视锥
-import * as Cesium from 'cesium';
+import * as Cesium from 'cesium'
/* eslint-disable new-cap */
/* eslint-disable no-undef */
export default class CreateFrustum {
- constructor(viewer, options) {
- this.position = options.position;
- this.viewer = viewer;
- this.fov = options.fov || 0;
- this.near = options.near || 0;
- this.far = options.far || 0;
- this.heading = options.heading || 0;
- this.pitch = options.pitch || 0;
- this.roll = options.roll || 0;
- this.width = options.width;
- this.height = options.height;
- this.add();
- }
+ constructor(viewer, options) {
+ this.position = options.position
+ this.viewer = viewer
+ this.fov = options.fov || 0
+ this.near = options.near || 0
+ this.far = options.far || 0
+ this.heading = options.heading || 0
+ this.pitch = options.pitch || 0
+ this.roll = options.roll || 0
+ this.width = options.width
+ this.height = options.height
+ this.add()
+ }
- UpdateWidth(value) {
- this.width = value;
- this.add();
- }
- UpdateHeight(value) {
- this.height = value;
- this.add();
- }
- UpdateFov(value) {
- this.fov = value;
- this.add();
- }
- UpdateNear(value) {
- this.near = value;
- this.add();
- }
- UpdateFar(value) {
- this.far = value;
- this.add();
- }
- UpdateHeading(value) {
- this.heading = value;
- this.add();
- }
- UpdatePitch(value) {
- this.pitch = value;
- this.add();
- }
- UpdateRoll(value) {
- this.roll = value;
- this.add();
- }
- UpdataPosition(position) {
- if (!position) return;
- this.position = position;
- this.add();
- }
+ UpdateWidth(value) {
+ this.width = value
+ this.add()
+ }
+ UpdateHeight(value) {
+ this.height = value
+ this.add()
+ }
+ UpdateFov(value) {
+ this.fov = value
+ this.add()
+ }
+ UpdateNear(value) {
+ this.near = value
+ this.add()
+ }
+ UpdateFar(value) {
+ this.far = value
+ this.add()
+ }
+ UpdateHeading(value) {
+ this.heading = value
+ this.add()
+ }
+ UpdatePitch(value) {
+ this.pitch = value
+ this.add()
+ }
+ UpdateRoll(value) {
+ this.roll = value
+ this.add()
+ }
+ UpdataPosition(position) {
+ if (!position) return
+ this.position = position
+ this.add()
+ }
- // 更新视锥体的姿态
- Update(position, headingPitchRoll) {
- this.position = Cesium.Cartesian3.fromDegrees(
- position.longitude,
- position.latitude,
- position.altitude,
- );
- this.orientation = Cesium.Transforms.headingPitchRollQuaternion(
- this.position,
- new Cesium.HeadingPitchRoll.fromDegrees(
- headingPitchRoll.heading,
- headingPitchRoll.pitch,
- headingPitchRoll.roll,
- ),
- );
- this.add();
- }
+ // 更新视锥体的姿态
+ Update(position, headingPitchRoll) {
+ this.position = Cesium.Cartesian3.fromDegrees(
+ position.longitude,
+ position.latitude,
+ position.altitude
+ )
+ this.orientation = Cesium.Transforms.headingPitchRollQuaternion(
+ this.position,
+ new Cesium.HeadingPitchRoll.fromDegrees(
+ headingPitchRoll.heading,
+ headingPitchRoll.pitch,
+ headingPitchRoll.roll
+ )
+ )
+ this.add()
+ }
- // 创建视锥体和轮廓线
- add() {
- this.clear();
- this.addFrustum();
- this.addOutline();
- this.addCenterline();
- }
+ // 创建视锥体和轮廓线
+ add() {
+ this.clear()
+ this.addFrustum()
+ this.addOutline()
+ this.addCenterline()
+ }
- // 清除视锥体和轮廓线
- clear() {
- this.clearFrustum();
- this.clearOutline();
- this.clearCenterline();
- }
+ // 清除视锥体和轮廓线
+ clear() {
+ this.clearFrustum()
+ this.clearOutline()
+ this.clearCenterline()
+ }
- // 清除视锥体
- clearFrustum() {
- if (this.frustumPrimitive) {
- this.viewer.scene.primitives.remove(this.frustumPrimitive);
- this.frustumPrimitive = null;
- }
- }
+ // 清除视锥体
+ clearFrustum() {
+ if (this.frustumPrimitive) {
+ this.viewer.scene.primitives.remove(this.frustumPrimitive)
+ this.frustumPrimitive = null
+ }
+ }
- // 清除轮廓线
- clearOutline() {
- if (this.outlinePrimitive) {
- this.viewer.scene.primitives.remove(this.outlinePrimitive);
- this.outlinePrimitive = null;
- }
- }
+ // 清除轮廓线
+ clearOutline() {
+ if (this.outlinePrimitive) {
+ this.viewer.scene.primitives.remove(this.outlinePrimitive)
+ this.outlinePrimitive = null
+ }
+ }
- clearCenterline() {
- if (this.centerDataSource) {
- this.centerDataSource.entities.removeAll();
- this.viewer.dataSources.remove(this.centerDataSource);
- this.centerDataSource = null;
- }
- }
+ clearCenterline() {
+ if (this.centerDataSource) {
+ this.centerDataSource.entities.removeAll()
+ this.viewer.dataSources.remove(this.centerDataSource)
+ this.centerDataSource = null
+ }
+ }
- // 创建视锥体
- addFrustum() {
- const frustum = new Cesium.PerspectiveFrustum({
- // 查看的视场角,绕Z轴旋转,以弧度方式输入
- fov: Cesium.Math.toRadians(this.fov),
- // 视锥体的宽度/高度
- aspectRatio: this.width / this.height,
- // 近面距视点的距离
- near: this.near,
- // 远面距视点的距离
- far: this.far,
- });
- const position = Cesium.Cartesian3.fromDegrees(
- this.position.longitude,
- this.position.latitude,
- this.position.altitude,
- );
- const geometry = new Cesium.FrustumGeometry({
- frustum: frustum,
- origin: position,
- orientation: Cesium.Transforms.headingPitchRollQuaternion(
- position,
- new Cesium.HeadingPitchRoll.fromDegrees(
- this.heading,
- this.pitch,
- this.roll,
- ),
- ),
- vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
- });
- const instance = new Cesium.GeometryInstance({
- geometry: geometry,
- attributes: {
- color: Cesium.ColorGeometryInstanceAttribute.fromColor(
- Cesium.Color.fromBytes(0, 213, 144, 20),
- ),
- },
- });
- const primitive = new Cesium.Primitive({
- geometryInstances: instance,
- appearance: new Cesium.PerInstanceColorAppearance({
- closed: true,
- flat: true,
- }),
- asynchronous: false,
- });
- this.frustumPrimitive = this.viewer.scene.primitives.add(primitive);
- }
+ // 创建视锥体
+ addFrustum() {
+ const frustum = new Cesium.PerspectiveFrustum({
+ // 查看的视场角,绕Z轴旋转,以弧度方式输入
+ fov: Cesium.Math.toRadians(this.fov),
+ // 视锥体的宽度/高度
+ aspectRatio: this.width / this.height,
+ // 近面距视点的距离
+ near: this.near,
+ // 远面距视点的距离
+ far: this.far,
+ })
+ const position = Cesium.Cartesian3.fromDegrees(
+ this.position.longitude,
+ this.position.latitude,
+ this.position.altitude
+ )
+ const geometry = new Cesium.FrustumGeometry({
+ frustum: frustum,
+ origin: position,
+ orientation: Cesium.Transforms.headingPitchRollQuaternion(
+ position,
+ new Cesium.HeadingPitchRoll.fromDegrees(this.heading, this.pitch, this.roll)
+ ),
+ vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
+ })
+ const instance = new Cesium.GeometryInstance({
+ geometry: geometry,
+ attributes: {
+ color: Cesium.ColorGeometryInstanceAttribute.fromColor(
+ Cesium.Color.fromBytes(0, 213, 144, 20)
+ ),
+ },
+ })
+ const primitive = new Cesium.Primitive({
+ geometryInstances: instance,
+ appearance: new Cesium.PerInstanceColorAppearance({
+ closed: true,
+ flat: true,
+ }),
+ asynchronous: false,
+ })
+ this.frustumPrimitive = this.viewer.scene.primitives.add(primitive)
+ }
- // 创建轮廓线
- addOutline() {
- const frustum = new Cesium.PerspectiveFrustum({
- // 查看的视场角度,绕Z轴旋转,以弧度方式输入
- // The angle of the field of view (FOV), in radians.
- // This angle will be used as the horizontal FOV if the width is greater than the height, otherwise it will be the vertical FOV.
- fov: Cesium.Math.toRadians(this.fov),
- // 视锥体的宽度/高度
- aspectRatio: this.width / this.height,
- // 近面距视点的距离
- near: this.near,
- // 远面距视点的距离
- far: this.far,
- });
- const position = Cesium.Cartesian3.fromDegrees(
- this.position.longitude,
- this.position.latitude,
- this.position.altitude,
- );
- const geometry = new Cesium.FrustumOutlineGeometry({
- frustum: frustum,
- origin: position,
- orientation: Cesium.Transforms.headingPitchRollQuaternion(
- position,
- new Cesium.HeadingPitchRoll.fromDegrees(
- this.heading,
- this.pitch,
- this.roll,
- ),
- ),
- vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
- });
- const instance = new Cesium.GeometryInstance({
- geometry: geometry,
- attributes: {
- color: Cesium.ColorGeometryInstanceAttribute.fromColor(
- Cesium.Color.fromBytes(0, 213, 144, 255),
- ),
- },
- });
- const primitive = new Cesium.Primitive({
- geometryInstances: instance,
- appearance: new Cesium.PerInstanceColorAppearance({
- closed: true,
- flat: true,
- }),
- asynchronous: false,
- });
- this.outlinePrimitive = this.viewer.scene.primitives.add(primitive);
- }
+ // 创建轮廓线
+ addOutline() {
+ const frustum = new Cesium.PerspectiveFrustum({
+ // 查看的视场角度,绕Z轴旋转,以弧度方式输入
+ // The angle of the field of view (FOV), in radians.
+ // This angle will be used as the horizontal FOV if the width is greater than the height, otherwise it will be the vertical FOV.
+ fov: Cesium.Math.toRadians(this.fov),
+ // 视锥体的宽度/高度
+ aspectRatio: this.width / this.height,
+ // 近面距视点的距离
+ near: this.near,
+ // 远面距视点的距离
+ far: this.far,
+ })
+ const position = Cesium.Cartesian3.fromDegrees(
+ this.position.longitude,
+ this.position.latitude,
+ this.position.altitude
+ )
+ const geometry = new Cesium.FrustumOutlineGeometry({
+ frustum: frustum,
+ origin: position,
+ orientation: Cesium.Transforms.headingPitchRollQuaternion(
+ position,
+ new Cesium.HeadingPitchRoll.fromDegrees(this.heading, this.pitch, this.roll)
+ ),
+ vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
+ })
+ const instance = new Cesium.GeometryInstance({
+ geometry: geometry,
+ attributes: {
+ color: Cesium.ColorGeometryInstanceAttribute.fromColor(
+ Cesium.Color.fromBytes(0, 213, 144, 255)
+ ),
+ },
+ })
+ const primitive = new Cesium.Primitive({
+ geometryInstances: instance,
+ appearance: new Cesium.PerInstanceColorAppearance({
+ closed: true,
+ flat: true,
+ }),
+ asynchronous: false,
+ })
+ this.outlinePrimitive = this.viewer.scene.primitives.add(primitive)
+ }
- addCenterline() {
- this.centerDataSource = new Cesium.CustomDataSource();
- this.viewer.dataSources.add(this.centerDataSource);
+ addCenterline() {
+ this.centerDataSource = new Cesium.CustomDataSource()
+ this.viewer.dataSources.add(this.centerDataSource)
- const position = Cesium.Cartesian3.fromDegrees(
- this.position.longitude,
- this.position.latitude,
- this.position.altitude,
- );
+ const position = Cesium.Cartesian3.fromDegrees(
+ this.position.longitude,
+ this.position.latitude,
+ this.position.altitude
+ )
- let matrix = Cesium.Matrix3.fromQuaternion(
- Cesium.Transforms.headingPitchRollQuaternion(
- position,
- new Cesium.HeadingPitchRoll.fromDegrees(
- this.heading,
- this.pitch,
- this.roll,
- ),
- ),
- new Cesium.Matrix3(),
- );
+ let matrix = Cesium.Matrix3.fromQuaternion(
+ Cesium.Transforms.headingPitchRollQuaternion(
+ position,
+ new Cesium.HeadingPitchRoll.fromDegrees(this.heading, this.pitch, this.roll)
+ ),
+ new Cesium.Matrix3()
+ )
- let right1 = Cesium.Matrix3.getColumn(matrix, 0, new Cesium.Cartesian3());
- let up1 = Cesium.Matrix3.getColumn(matrix, 1, new Cesium.Cartesian3());
- let direction = Cesium.Matrix3.getColumn(
- matrix,
- 2,
- new Cesium.Cartesian3(),
- );
+ let right1 = Cesium.Matrix3.getColumn(matrix, 0, new Cesium.Cartesian3())
+ let up1 = Cesium.Matrix3.getColumn(matrix, 1, new Cesium.Cartesian3())
+ let direction = Cesium.Matrix3.getColumn(matrix, 2, new Cesium.Cartesian3())
- // const direction = new Cartesian3(-0.10668226241650887, 0.8103322335050215, -0.5761775474872814)
+ // const direction = new Cartesian3(-0.10668226241650887, 0.8103322335050215, -0.5761775474872814)
- let frontDirect = Cesium.Cartesian3.multiplyByScalar(
- direction,
- this.far,
- new Cesium.Cartesian3(),
- );
- let bottomCenter = Cesium.Cartesian3.add(
- position,
- frontDirect,
- new Cesium.Cartesian3(),
- );
+ let frontDirect = Cesium.Cartesian3.multiplyByScalar(
+ direction,
+ this.far,
+ new Cesium.Cartesian3()
+ )
+ let bottomCenter = Cesium.Cartesian3.add(position, frontDirect, new Cesium.Cartesian3())
- // 创建Entity来显示中心线
- this.centerDataSource.entities.add({
- name: 'Center Line of Frustum',
- polyline: {
- positions: [position, bottomCenter],
- width: 1,
- // material: Cesium.Color.RED.withAlpha(0.5)
- material: new Cesium.PolylineDashMaterialProperty({
- color: Cesium.Color.fromBytes(0, 213, 144, 255),
- dashLength: 30.0,
- gapColor: Cesium.Color.TRANSPARENT,
- gapWidth: 1.0,
- }),
- },
- });
- }
+ // 创建Entity来显示中心线
+ this.centerDataSource.entities.add({
+ name: 'Center Line of Frustum',
+ polyline: {
+ positions: [position, bottomCenter],
+ width: 1,
+ // material: Cesium.Color.RED.withAlpha(0.5)
+ material: new Cesium.PolylineDashMaterialProperty({
+ color: Cesium.Color.fromBytes(0, 213, 144, 255),
+ dashLength: 30.0,
+ gapColor: Cesium.Color.TRANSPARENT,
+ gapWidth: 1.0,
+ }),
+ },
+ })
+ }
}
--
Gitblit v1.9.3