/** * 道路 */ import Base from "../index"; import PolylineImageTrailMaterialProperty from "../../Materail/PolylineImageTrailMaterialProperty"; import { init_material } from "./RoadMaterialProperty"; class Corridor extends Base { /** * @constructor * @param sdk * @param options {object} 属性 * @param options.name{string} 名称 * @param options.image{string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement} 指定 Image、URL、Canvas 或 Video 的属性 * @param options.width=10{number} 宽度 * @param options.height=0{number} 高度 * */ constructor(sdk, options = {}) { super(sdk, options); this.options.name = options.name || '' this.options.image = options.image this.options.width = options.width || 10 this.options.height = options.height || 0 init_material() } create(positions) { this.computeRoad(positions) let fromDegreesArray = [] for (let i = 0; i < positions.length; i++) { fromDegreesArray.push(positions[i].lng, positions[i].lat) } let length = this.computeDistance2(positions) let geometry = new Cesium.CorridorGeometry({ positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), width: this.options.width, height: this.options.height, cornerType: Cesium.CornerType.MITERED, vertexFormat: Cesium.MaterialAppearance.MaterialSupport.ALL.vertexFormat }) // console.log(Cesium.CorridorGeometry.createGeometry(geometry)) // this.entity = this.sdk.viewer.scene.primitives.add(new Cesium.Primitive({//GroundPrimitive贴地 // geometryInstances: new Cesium.GeometryInstance({ // geometry: geometry, // attributes: { // color: Cesium.ColorGeometryInstanceAttribute.fromColor(new Cesium.Color(1.0, 1.0, 1.0, 0.5)) // } // }), // appearance: new Cesium.MaterialAppearance({ // material: Cesium.Material.fromType('Image', { // image: this.options.image, // repeat: new Cesium.Cartesian2(length / this.options.width * 2, 1.0) // }), // faceForward: true, // renderState: { // blending: Cesium.BlendingState.ALPHA_BLEND // } // }) // })); // console.log(this.entity, Outlinegeometry) // this.entity = this.sdk.viewer.entities.add({ // name: "Red corridor on surface with rounded corners", // corridor: { // positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), // width: this.options.width, // height: 10, // cornerType: Cesium.CornerType.MITERED, // material: new Cesium.ImageMaterialProperty({ // image: this.options.image, // repeat: new Cesium.Cartesian2(100, 1.0), // color: Cesium.Color.TOMATO // }) // } // }); } // 编辑框 async edit(state) { } remove() { this.sdk.viewer.scene.primitives.remove(this.entity) this.entity = null } computeRoad(positions) { let fromDegreesArray = [] for (let i = 0; i < positions.length; i++) { fromDegreesArray.push(positions[i].lng, positions[i].lat) } let Outlinegeometry = new Cesium.CorridorGeometry({ positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), width: this.options.width, cornerType: Cesium.CornerType.MITERED, vertexFormat: Cesium.MaterialAppearance.MaterialSupport.ALL.vertexFormat }) let geometry = Cesium.CorridorGeometry.createGeometry(Outlinegeometry) console.log(geometry) let t = 0 setInterval(() => { t++ }, 100); // let entity = this.sdk.viewer.scene.primitives.add(new Cesium.GroundPolylinePrimitive({ // geometryInstances : new Cesium.GeometryInstance({ // geometry : new Cesium.GroundPolylineGeometry({ // positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), // width: this.options.width, // cornerType: Cesium.CornerType.MITERED, // vertexFormat: Cesium.MaterialAppearance.MaterialSupport.ALL.vertexFormat // }) // }), // appearance: new Cesium.PolylineMaterialAppearance({ // aboveGroud: true, // material: new Cesium.Material({ // fabric: { // uniforms: { // image: this.options.image, // repeat: new Cesium.Cartesian2(1000, 1.0), // color: new Cesium.Color(1.0, 0.0, 0.0, 0.1) // }, // source: ` // uniform sampler2D image; // uniform vec4 color; // uniform vec2 repeat; // czm_material czm_getMaterial(czm_materialInput materialInput){ // czm_material material=czm_getDefaultMaterial(materialInput); // vec2 st=repeat*materialInput.st; // float time=fract(czm_frameNumber); // vec4 colorImage=texture2D(image,vec2(fract(st.s-time),st.t)); // material.alpha=colorImage.a; // material.diffuse=colorImage.rgb; // return material; // }`, // }, // }), // vertexShaderSource: `#define CLIP_POLYLINE // void clipLineSegmentToNearPlane( // vec3 p0, // vec3 p1, // out vec4 positionWC, // out bool clipped, // out bool culledByNearPlane, // out vec4 clippedPositionEC) // { // culledByNearPlane = false; // clipped = false; // vec3 p0ToP1 = p1 - p0; // float magnitude = length(p0ToP1); // vec3 direction = normalize(p0ToP1); // float endPoint0Distance = czm_currentFrustum.x + p0.z; // float denominator = -direction.z; // if (endPoint0Distance > 0.0 && abs(denominator) < czm_epsilon7) // { // culledByNearPlane = true; // } // else if (endPoint0Distance > 0.0) // { // float t = endPoint0Distance / denominator; // if (t < 0.0 || t > magnitude) // { // culledByNearPlane = true; // } // else // { // p0 = p0 + t * direction; // p0.z = min(p0.z, -czm_currentFrustum.x); // clipped = true; // } // } // clippedPositionEC = vec4(p0, 1.0); // positionWC = czm_eyeToWindowCoordinates(clippedPositionEC); // } // vec4 getPolylineWindowCoordinatesEC(vec4 positionEC, vec4 prevEC, vec4 nextEC, float expandDirection, float width, bool usePrevious, out float angle) // { // #ifdef POLYLINE_DASH // vec4 positionWindow = czm_eyeToWindowCoordinates(positionEC); // vec4 previousWindow = czm_eyeToWindowCoordinates(prevEC); // vec4 nextWindow = czm_eyeToWindowCoordinates(nextEC); // vec2 lineDir; // if (usePrevious) { // lineDir = normalize(positionWindow.xy - previousWindow.xy); // } // else { // lineDir = normalize(nextWindow.xy - positionWindow.xy); // } // angle = atan(lineDir.x, lineDir.y) - 1.570796327; // angle = floor(angle / czm_piOverFour + 0.5) * czm_piOverFour; // #endif // vec4 clippedPrevWC, clippedPrevEC; // bool prevSegmentClipped, prevSegmentCulled; // clipLineSegmentToNearPlane(prevEC.xyz, positionEC.xyz, clippedPrevWC, prevSegmentClipped, prevSegmentCulled, clippedPrevEC); // vec4 clippedNextWC, clippedNextEC; // bool nextSegmentClipped, nextSegmentCulled; // clipLineSegmentToNearPlane(nextEC.xyz, positionEC.xyz, clippedNextWC, nextSegmentClipped, nextSegmentCulled, clippedNextEC); // bool segmentClipped, segmentCulled; // vec4 clippedPositionWC, clippedPositionEC; // clipLineSegmentToNearPlane(positionEC.xyz, usePrevious ? prevEC.xyz : nextEC.xyz, clippedPositionWC, segmentClipped, segmentCulled, clippedPositionEC); // if (segmentCulled) // { // return vec4(0.0, 0.0, 0.0, 1.0); // } // vec2 directionToPrevWC = normalize(clippedPrevWC.xy - clippedPositionWC.xy); // vec2 directionToNextWC = normalize(clippedNextWC.xy - clippedPositionWC.xy); // if (prevSegmentCulled) // { // directionToPrevWC = -directionToNextWC; // } // else if (nextSegmentCulled) // { // directionToNextWC = -directionToPrevWC; // } // vec2 thisSegmentForwardWC, otherSegmentForwardWC; // if (usePrevious) // { // thisSegmentForwardWC = -directionToPrevWC; // otherSegmentForwardWC = directionToNextWC; // } // else // { // thisSegmentForwardWC = directionToNextWC; // otherSegmentForwardWC = -directionToPrevWC; // } // vec2 thisSegmentLeftWC = vec2(-thisSegmentForwardWC.y, thisSegmentForwardWC.x); // vec2 leftWC = thisSegmentLeftWC; // float expandWidth = width * 0.5; // if (!czm_equalsEpsilon(prevEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1) && !czm_equalsEpsilon(nextEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1)) // { // vec2 otherSegmentLeftWC = vec2(-otherSegmentForwardWC.y, otherSegmentForwardWC.x); // vec2 leftSumWC = thisSegmentLeftWC + otherSegmentLeftWC; // float leftSumLength = length(leftSumWC); // leftWC = leftSumLength < czm_epsilon6 ? thisSegmentLeftWC : (leftSumWC / leftSumLength); // vec2 u = -thisSegmentForwardWC; // vec2 v = leftWC; // float sinAngle = abs(u.x * v.y - u.y * v.x); // expandWidth = clamp(expandWidth / sinAngle, 0.0, width * 2.0); // } // vec2 offset = leftWC * expandDirection * expandWidth * czm_pixelRatio; // return vec4(clippedPositionWC.xy + offset, -clippedPositionWC.z, 1.0) * (czm_projection * clippedPositionEC).w; // } // vec4 getPolylineWindowCoordinates(vec4 position, vec4 previous, vec4 next, float expandDirection, float width, bool usePrevious, out float angle) // { // vec4 positionEC = czm_modelViewRelativeToEye * position; // vec4 prevEC = czm_modelViewRelativeToEye * previous; // vec4 nextEC = czm_modelViewRelativeToEye * next; // return getPolylineWindowCoordinatesEC(positionEC, prevEC, nextEC, expandDirection, width, usePrevious, angle); // } // attribute vec3 position3DHigh; // attribute vec3 position3DLow; // attribute vec3 prevPosition3DHigh; // attribute vec3 prevPosition3DLow; // attribute vec3 nextPosition3DHigh; // attribute vec3 nextPosition3DLow; // attribute vec2 expandAndWidth; // attribute vec2 st; // attribute float batchId; // varying float v_width; // varying vec2 v_st; // varying float v_polylineAngle; // void main() // { // float expandDir = expandAndWidth.x; // float width = abs(expandAndWidth.y) + 0.5; // bool usePrev = expandAndWidth.y < 0.0; // vec4 p = czm_computePosition(); // vec4 prev = czm_computePrevPosition(); // vec4 next = czm_computeNextPosition(); // float angle; // vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle); // gl_Position = czm_viewportOrthographic * positionWC; // v_width = width; // v_st.s = st.s; // v_st.t = czm_writeNonPerspective(st.t, gl_Position.w); // v_polylineAngle = angle; // }`, // fragmentShaderSource: `#ifdef VECTOR_TILE // uniform vec4 u_highlightColor; // #endif // varying vec2 v_st; // void main() // { // czm_materialInput materialInput; // vec2 st = v_st; // st.t = czm_readNonPerspective(st.t, gl_FragCoord.w); // materialInput.s = st.s; // materialInput.st = st; // materialInput.str = vec3(st, 0.0); // czm_material material = czm_getMaterial(materialInput); // gl_FragColor = vec4(material.diffuse + material.emission, material.alpha); // #ifdef VECTOR_TILE // gl_FragColor *= u_highlightColor; // #endif // czm_writeLogDepth(); // }` // }), // })); console.log(entity) // let entity = this.sdk.viewer.entities.add({ // corridor: { // positions: Cesium.Cartesian3.fromDegreesArray(fromDegreesArray), // width: 20000.0, // cornerType: Cesium.CornerType.MITERED, // material: new Cesium.RoadMaterialProperty({ // image: this.getSourceRootPath() + '/img/asphaltRoad.jpg', // color: this.options.color, // repeat: new Cesium.CallbackProperty(() => { // let positionProperty = entity.corridor.positions; // let positions = positionProperty.getValue(this.sdk.viewer.clock.currentTime); // if (!Cesium.defined(positions)) { // return new Cesium.Cartesian2(1.0, 1.0); // } // let distance = 0; // for (let i = 0; i < positions.length - 1; ++i) { // distance += Cesium.Cartesian3.distance(positions[i], positions[i + 1]); // } // let imgProportion = 945 / 411 // 图片长宽比例 // let repeatX = distance / 20000; // repeatX = repeatX / imgProportion // return new Cesium.Cartesian2(repeatX, 1.0); // }, false), // duration: 0, // rotate: new Cesium.CallbackProperty(() => { // return t // }), // }) // }, // }); // console.log(entity) let initposition = [] for (let i = 0; i < geometry.attributes.position.values.length; i += 3) { console.log(geometry.attributes.position.values[i], geometry.attributes.position.values[i + 1], geometry.attributes.position.values[i + 2]) initposition.push(new Cesium.Cartesian3(geometry.attributes.position.values[i], geometry.attributes.position.values[i + 1], geometry.attributes.position.values[i + 2])) } console.log(initposition, Cesium.Cartesian3.fromDegrees(91.08567036051947, 24.990201656481236)) let flag = true let bearing this.entityArray = [] // 创建一个矩形实体,顶点坐标为世界坐标 const rectangle = this.sdk.viewer.entities.add({ rectangle: { coordinates: Cesium.Rectangle.fromDegrees(-100.0, 20.0, -90.0, 30.0), material: new Cesium.ImageMaterialProperty({ image: this.options.image, repeat: new Cesium.Cartesian2(10, 1.0), }), }, }); for (let i = 0; i < geometry.indices.length; i += 3) { // console.log(bearing) let angleInDegrees let theta if (flag) { let a = this.cartesian3Towgs84(initposition[geometry.indices[i]], this.sdk.viewer) let b = this.cartesian3Towgs84(initposition[geometry.indices[i + 2]], this.sdk.viewer) let point1 = turf.point([a.lng, a.lat]); let point2 = turf.point([b.lng, b.lat]); bearing = turf.bearing(point1, point2); // 计算两点之间的角度 let angle = Cesium.Cartesian3.angleBetween(initposition[geometry.indices[i]], initposition[geometry.indices[i + 2]]); // 转换角度为角度而不是弧度 angleInDegrees = Cesium.Math.toDegrees(angle) //以a点为原点建立局部坐标系(东方向为x轴,北方向为y轴,垂直于地面为z轴),得到一个局部坐标到世界坐标转换的变换矩阵 let localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(initposition[geometry.indices[i]]); //求世界坐标到局部坐标的变换矩阵 let worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4()); //a点在局部坐标的位置,其实就是局部坐标原点 let localPosition_A = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, initposition[geometry.indices[i]], new Cesium.Cartesian3()); //B点在以A点为原点的局部的坐标位置 let localPosition_B = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, initposition[geometry.indices[i + 2]], new Cesium.Cartesian3()); //弧度 let angle2 = Cesium.Math.fastApproximateAtan2((localPosition_B.y - localPosition_A.y), (localPosition_B.x - localPosition_A.x)) //角度 theta = angle2 * (180 / Cesium.Math.PI); } else { let a = this.cartesian3Towgs84(initposition[geometry.indices[i + 1]], this.sdk.viewer) let b = this.cartesian3Towgs84(initposition[geometry.indices[i + 2]], this.sdk.viewer) let point1 = turf.point([a.lng, a.lat]); let point2 = turf.point([b.lng, b.lat]); bearing = turf.bearing(point1, point2); // 计算两点之间的角度 let angle = Cesium.Cartesian3.angleBetween(initposition[geometry.indices[i + 1]], initposition[geometry.indices[i + 2]]); // 转换角度为角度而不是弧度 angleInDegrees = Cesium.Math.toDegrees(angle) //以a点为原点建立局部坐标系(东方向为x轴,北方向为y轴,垂直于地面为z轴),得到一个局部坐标到世界坐标转换的变换矩阵 let localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(initposition[geometry.indices[i + 1]]); //求世界坐标到局部坐标的变换矩阵 let worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4()); //a点在局部坐标的位置,其实就是局部坐标原点 let localPosition_A = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, initposition[geometry.indices[i + 1]], new Cesium.Cartesian3()); //B点在以A点为原点的局部的坐标位置 let localPosition_B = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, initposition[geometry.indices[i + 2]], new Cesium.Cartesian3()); //弧度 let angle2 = Cesium.Math.fastApproximateAtan2((localPosition_B.y - localPosition_A.y), (localPosition_B.x - localPosition_A.x)) //角度 theta = angle2 * (180 / Cesium.Math.PI); } let point1 = Cesium.Cartesian3.fromDegrees(91, 24.990201656481236); let point2 = Cesium.Cartesian3.fromDegrees(91, 24.626517401118033); // 计算两点之间的角度 let angle = Cesium.Cartesian3.angleBetween(point1, point2); // 转换角度为角度而不是弧度 let xx = Cesium.Math.toDegrees(angle) flag = !flag bearing = bearing - 90 + 0.145 console.log(bearing, angleInDegrees, angle, xx, theta) //以a点为原点建立局部坐标系(东方向为x轴,北方向为y轴,垂直于地面为z轴),得到一个局部坐标到世界坐标转换的变换矩阵 let localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(point1); //求世界坐标到局部坐标的变换矩阵 let worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4()); //a点在局部坐标的位置,其实就是局部坐标原点 let localPosition_A = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, point1, new Cesium.Cartesian3()); //B点在以A点为原点的局部的坐标位置 let localPosition_B = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, point2, new Cesium.Cartesian3()); //弧度 let angle2 = Cesium.Math.fastApproximateAtan2((localPosition_B.z - localPosition_A.z), (localPosition_B.x - localPosition_A.x)) //角度 let theta2 = angle2 * (180 / Cesium.Math.PI); // alert(theta2) // let entity = this.sdk.viewer.entities.add({ // show: this.options.show, // polygon: { // hierarchy: new Cesium.PolygonHierarchy([initposition[geometry.indices[i]], initposition[geometry.indices[i + 1]], initposition[geometry.indices[i + 2]]]), // perPositionHeight: false, // // material: new PolylineImageTrailMaterialProperty({ // // image: this.options.image, // // repeat: new Cesium.Cartesian2(10, 1.0), // // color: Cesium.Color.TOMATO, // // rotate: 0 // // }), // material: new Cesium.ImageMaterialProperty({ // image: this.options.image, // repeat: new Cesium.Cartesian2(1000, 1.0), // }), // stRotation: Cesium.Math.toRadians(theta - 90 - 0.0128), // outline: true, // outlineColor: Cesium.Color.BLACK, // } // }) let aa = 0 const shader = ` uniform sampler2D image; uniform vec4 color; uniform vec2 repeat; czm_material czm_getMaterial(czm_materialInput materialInput){ czm_material material=czm_getDefaultMaterial(materialInput); vec2 st=repeat*materialInput.st; float time=fract(czm_frameNumber); vec4 colorImage=texture2D(image,vec2(fract(st.s-time),st.t)); material.alpha=colorImage.a; material.diffuse=colorImage.rgb; return material; }` console.log(Cesium.Math.toRadians(theta - 90)) // let entity = this.sdk.viewer.scene.primitives.add(new Cesium.Primitive({ // geometryInstances : new Cesium.GeometryInstance({ // geometry : new Cesium.PolylineGeometry({ // positions : Cesium.Cartesian3.fromDegreesArray([ // 0.0, 0.0, // 5.0, 0.0 // ]), // width : 10.0, // vertexFormat : Cesium.PolylineMaterialAppearance.VERTEX_FORMAT // }) // }), // appearance: new Cesium.PolylineMaterialAppearance({ // aboveGroud: true, // material: new Cesium.Material({ // fabric: { // uniforms: { // image: this.options.image, // repeat: new Cesium.Cartesian2(1000, 1.0), // color: new Cesium.Color(1.0, 0.0, 0.0, 0.1) // }, // source: shader, // }, // }), // vertexShaderSource: `#define CLIP_POLYLINE // void clipLineSegmentToNearPlane( // vec3 p0, // vec3 p1, // out vec4 positionWC, // out bool clipped, // out bool culledByNearPlane, // out vec4 clippedPositionEC) // { // culledByNearPlane = false; // clipped = false; // vec3 p0ToP1 = p1 - p0; // float magnitude = length(p0ToP1); // vec3 direction = normalize(p0ToP1); // float endPoint0Distance = czm_currentFrustum.x + p0.z; // float denominator = -direction.z; // if (endPoint0Distance > 0.0 && abs(denominator) < czm_epsilon7) // { // culledByNearPlane = true; // } // else if (endPoint0Distance > 0.0) // { // float t = endPoint0Distance / denominator; // if (t < 0.0 || t > magnitude) // { // culledByNearPlane = true; // } // else // { // p0 = p0 + t * direction; // p0.z = min(p0.z, -czm_currentFrustum.x); // clipped = true; // } // } // clippedPositionEC = vec4(p0, 1.0); // positionWC = czm_eyeToWindowCoordinates(clippedPositionEC); // } // vec4 getPolylineWindowCoordinatesEC(vec4 positionEC, vec4 prevEC, vec4 nextEC, float expandDirection, float width, bool usePrevious, out float angle) // { // #ifdef POLYLINE_DASH // vec4 positionWindow = czm_eyeToWindowCoordinates(positionEC); // vec4 previousWindow = czm_eyeToWindowCoordinates(prevEC); // vec4 nextWindow = czm_eyeToWindowCoordinates(nextEC); // vec2 lineDir; // if (usePrevious) { // lineDir = normalize(positionWindow.xy - previousWindow.xy); // } // else { // lineDir = normalize(nextWindow.xy - positionWindow.xy); // } // angle = atan(lineDir.x, lineDir.y) - 1.570796327; // angle = floor(angle / czm_piOverFour + 0.5) * czm_piOverFour; // #endif // vec4 clippedPrevWC, clippedPrevEC; // bool prevSegmentClipped, prevSegmentCulled; // clipLineSegmentToNearPlane(prevEC.xyz, positionEC.xyz, clippedPrevWC, prevSegmentClipped, prevSegmentCulled, clippedPrevEC); // vec4 clippedNextWC, clippedNextEC; // bool nextSegmentClipped, nextSegmentCulled; // clipLineSegmentToNearPlane(nextEC.xyz, positionEC.xyz, clippedNextWC, nextSegmentClipped, nextSegmentCulled, clippedNextEC); // bool segmentClipped, segmentCulled; // vec4 clippedPositionWC, clippedPositionEC; // clipLineSegmentToNearPlane(positionEC.xyz, usePrevious ? prevEC.xyz : nextEC.xyz, clippedPositionWC, segmentClipped, segmentCulled, clippedPositionEC); // if (segmentCulled) // { // return vec4(0.0, 0.0, 0.0, 1.0); // } // vec2 directionToPrevWC = normalize(clippedPrevWC.xy - clippedPositionWC.xy); // vec2 directionToNextWC = normalize(clippedNextWC.xy - clippedPositionWC.xy); // if (prevSegmentCulled) // { // directionToPrevWC = -directionToNextWC; // } // else if (nextSegmentCulled) // { // directionToNextWC = -directionToPrevWC; // } // vec2 thisSegmentForwardWC, otherSegmentForwardWC; // if (usePrevious) // { // thisSegmentForwardWC = -directionToPrevWC; // otherSegmentForwardWC = directionToNextWC; // } // else // { // thisSegmentForwardWC = directionToNextWC; // otherSegmentForwardWC = -directionToPrevWC; // } // vec2 thisSegmentLeftWC = vec2(-thisSegmentForwardWC.y, thisSegmentForwardWC.x); // vec2 leftWC = thisSegmentLeftWC; // float expandWidth = width * 0.5; // if (!czm_equalsEpsilon(prevEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1) && !czm_equalsEpsilon(nextEC.xyz - positionEC.xyz, vec3(0.0), czm_epsilon1)) // { // vec2 otherSegmentLeftWC = vec2(-otherSegmentForwardWC.y, otherSegmentForwardWC.x); // vec2 leftSumWC = thisSegmentLeftWC + otherSegmentLeftWC; // float leftSumLength = length(leftSumWC); // leftWC = leftSumLength < czm_epsilon6 ? thisSegmentLeftWC : (leftSumWC / leftSumLength); // vec2 u = -thisSegmentForwardWC; // vec2 v = leftWC; // float sinAngle = abs(u.x * v.y - u.y * v.x); // expandWidth = clamp(expandWidth / sinAngle, 0.0, width * 2.0); // } // vec2 offset = leftWC * expandDirection * expandWidth * czm_pixelRatio; // return vec4(clippedPositionWC.xy + offset, -clippedPositionWC.z, 1.0) * (czm_projection * clippedPositionEC).w; // } // vec4 getPolylineWindowCoordinates(vec4 position, vec4 previous, vec4 next, float expandDirection, float width, bool usePrevious, out float angle) // { // vec4 positionEC = czm_modelViewRelativeToEye * position; // vec4 prevEC = czm_modelViewRelativeToEye * previous; // vec4 nextEC = czm_modelViewRelativeToEye * next; // return getPolylineWindowCoordinatesEC(positionEC, prevEC, nextEC, expandDirection, width, usePrevious, angle); // } // attribute vec3 position3DHigh; // attribute vec3 position3DLow; // attribute vec3 prevPosition3DHigh; // attribute vec3 prevPosition3DLow; // attribute vec3 nextPosition3DHigh; // attribute vec3 nextPosition3DLow; // attribute vec2 expandAndWidth; // attribute vec2 st; // attribute float batchId; // varying float v_width; // varying vec2 v_st; // varying float v_polylineAngle; // void main() // { // float expandDir = expandAndWidth.x; // float width = abs(expandAndWidth.y) + 0.5; // bool usePrev = expandAndWidth.y < 0.0; // vec4 p = czm_computePosition(); // vec4 prev = czm_computePrevPosition(); // vec4 next = czm_computeNextPosition(); // float angle; // vec4 positionWC = getPolylineWindowCoordinates(p, prev, next, expandDir, width, usePrev, angle); // gl_Position = czm_viewportOrthographic * positionWC; // v_width = width; // v_st.s = st.s; // v_st.t = czm_writeNonPerspective(st.t, gl_Position.w); // v_polylineAngle = angle; // }`, // fragmentShaderSource: `#ifdef VECTOR_TILE // uniform vec4 u_highlightColor; // #endif // varying vec2 v_st; // void main() // { // czm_materialInput materialInput; // vec2 st = v_st; // st.t = czm_readNonPerspective(st.t, gl_FragCoord.w); // materialInput.s = st.s; // materialInput.st = st; // materialInput.str = vec3(st, 0.0); // czm_material material = czm_getMaterial(materialInput); // gl_FragColor = vec4(material.diffuse + material.emission, material.alpha); // #ifdef VECTOR_TILE // gl_FragColor *= u_highlightColor; // #endif // czm_writeLogDepth(); // }` // }), // })); // console.log(entity) // let geometryInstances2 = new Cesium.GeometryInstance({ // geometry: new Cesium.PolygonGeometry({ // polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray([100, 1, 101, 1, 101, -1, 100, -1])), // }), // }) // let entity2 = this.sdk.viewer.scene.primitives.add(new Cesium.GroundPrimitive({ // geometryInstances: geometryInstances2, // appearance: new Cesium.EllipsoidSurfaceAppearance({ // aboveGroud: true, // material: new Cesium.Material({ // fabric: { // uniforms: { // color: new Cesium.Color(1.0, 0.0, 0.0, 0.1), // image: this.options.image, // repeat: new Cesium.Cartesian2(1000, 1.0), // rotate: 0 // }, // source: shader // }, // }), // }), // })); // console.log(geometryInstances2) // // 获取多边形的边界矩形 // let boundingSphere = geometryInstances2.geometry.boundingSphere; // // 创建一个矩阵,它表示多边形的本地坐标到世界坐标的转换 // let matrix = Cesium.Transforms.eastNorthUpToFixedFrame(boundingSphere.center); // console.log(entity2, matrix) // setInterval(() => { // }, 100); // this.entityArray.push(entity) console.log(entity) } // let entity = this.sdk.viewer.entities.add({ // show: this.options.show, // polygon: { // hierarchy: new Cesium.PolygonHierarchy([ // new Cesium.Cartesian3(1201222.3498141132, 5794200.4246190665, 2372132.932514765), // new Cesium.Cartesian3(1200929.6921250424, 5794615.962987943, 2371271.7244476764), // new Cesium.Cartesian3(1199139.8791256004, 5794316.892300814, 2372896.7988495603)]), // perPositionHeight: true, // material: new PolylineImageTrailMaterialProperty({ // image: this.options.image, // repeat: new Cesium.Cartesian2(10, 1.0), // color: Cesium.Color.TOMATO, // rotate: 0 // }), // outline: true, // outlineColor: Cesium.Color.BLACK, // } // }) // console.log(entity) // 创建新材质 let newMaterial = new Cesium.Material({ fabric: { type: 'Color', uniforms: { color: new Cesium.Color(1.0, 0.0, 0.0, 1.0) // 红色 } } }); console.log(newMaterial) // this.entity = this.sdk.viewer.entities.add({ // show: this.options.show, // polygon: { // hierarchy: new Cesium.PolygonHierarchy(initposition), // perPositionHeight: false, // material: new Cesium.ImageMaterialProperty({ // image: this.options.image, // repeat: new Cesium.Cartesian2(100, 1.0), // color: Cesium.Color.AQUA // }) // } // }) for (let i = 0; i < initposition.length; i++) { let entity = this.sdk.viewer.entities.add({ name: 'node-secondary-edit-point', index: i, position: initposition[i], billboard: { image: this.getSourceRootPath() + '/img/point.png', width: 15, height: 15, disableDepthTestDistance: Number.POSITIVE_INFINITY, color: Cesium.Color.WHITE.withAlpha(0.99) }, label: { text: '' + i, pixelOffset: { x: 0, y: -20 }, }, }) } this.sdk.viewer.entities.add({ name: 'node-secondary-edit-point', position: Cesium.Cartesian3.fromDegrees(91.08567036051947, 24.990201656481236), billboard: { image: this.getSourceRootPath() + '/img/point.png', width: 15, height: 15, disableDepthTestDistance: Number.POSITIVE_INFINITY, color: Cesium.Color.WHITE.withAlpha(0.99) }, }) this.sdk.viewer.entities.add({ name: 'node-secondary-edit-point', position: Cesium.Cartesian3.fromDegrees(91.08588488854294, 24.626517401118033), billboard: { image: this.getSourceRootPath() + '/img/point.png', width: 15, height: 15, disableDepthTestDistance: Number.POSITIVE_INFINITY, color: Cesium.Color.WHITE.withAlpha(0.99) }, }) } test(v) { for (let i = 0; i < this.entityArray.length; i++) { this.entityArray[i].polygon.stRotation = Cesium.Math.toRadians(v) } } } export default Corridor