mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-07-05 07:37:31 +00:00
297 lines
40 KiB
JavaScript
297 lines
40 KiB
JavaScript
![]() |
var videos = [];
|
||
|
var video_dom;
|
||
|
var getCurrentMousePosition = function (scene, position, noPickEntity) {
|
||
|
var cartesian;
|
||
|
var pickedObject = scene.pick(position);
|
||
|
if (scene.pickPositionSupported && Cesium.defined(pickedObject)) {
|
||
|
var entity = pickedObject.id;
|
||
|
if (noPickEntity == null || (noPickEntity && entity !== noPickEntity)) {
|
||
|
var cartesian = scene.pickPosition(position);
|
||
|
if (Cesium.defined(cartesian)) {
|
||
|
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
|
||
|
var height = cartographic.height;
|
||
|
if (height >= 0) return cartesian;
|
||
|
|
||
|
if (!Cesium.defined(pickedObject.id) && height >= -500)
|
||
|
return cartesian;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (scene.mode === Cesium.SceneMode.SCENE3D) {
|
||
|
var pickRay = scene.camera.getPickRay(position);
|
||
|
cartesian = scene.globe.pick(pickRay, scene);
|
||
|
} else {
|
||
|
cartesian = scene.camera.pickEllipsoid(position, scene.globe.ellipsoid);
|
||
|
}
|
||
|
return cartesian;
|
||
|
}
|
||
|
|
||
|
class video {
|
||
|
constructor(viewer, config) {
|
||
|
this.viewer = viewer;
|
||
|
this.config = config;
|
||
|
|
||
|
}
|
||
|
|
||
|
creat() {
|
||
|
var viewer = this.viewer;
|
||
|
var config = this.config;
|
||
|
var videoElement = config.videoElement;
|
||
|
var positions = config.positions;
|
||
|
var clampToGround = config.clampToGround;
|
||
|
if (clampToGround) {
|
||
|
viewer.entities.add({
|
||
|
nam: "video",
|
||
|
polygon: {
|
||
|
hierarchy: Cesium.Cartesian3.fromDegreesArray(positions),
|
||
|
material: videoElement
|
||
|
}
|
||
|
});
|
||
|
} else {
|
||
|
viewer.entities.add({
|
||
|
nam: "video",
|
||
|
polygon: {
|
||
|
hierarchy: {
|
||
|
positions: Cesium.Cartesian3.fromDegreesArrayHeights(positions)
|
||
|
},
|
||
|
material: videoElement,
|
||
|
perPositionHeight: true,
|
||
|
outline: true
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
clearAll() {
|
||
|
var dd = viewer.entities._entities._array;
|
||
|
for (let index = 0; index < dd.length; index++) {
|
||
|
if (dd[index]._nam = "video") {
|
||
|
viewer.entities.remove(dd[index])
|
||
|
index--;
|
||
|
}
|
||
|
}
|
||
|
videos.forEach((v) => {
|
||
|
v.destroy();
|
||
|
})
|
||
|
}
|
||
|
|
||
|
change(object) {
|
||
|
var _this = this;
|
||
|
for (const key in object) {
|
||
|
const element = object[key];
|
||
|
_this.lightCamera.frustum[key] = element;
|
||
|
_this.clear()
|
||
|
_this.drawFrustumOutline();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
drawVideo() {
|
||
|
let _self = this;
|
||
|
var options = this.config;
|
||
|
this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
|
||
|
|
||
|
this.horizontalViewAngle = options.horizontalViewAngle || 60.0;
|
||
|
this.verticalViewAngle = options.verticalViewAngle || 40.0;
|
||
|
video_dom = document.getElementById(options.video);
|
||
|
|
||
|
this.options = options;
|
||
|
this.posArray = [];
|
||
|
this.state = "PREPARE";
|
||
|
if (options.viewPosition && options.viewPositionEnd) {
|
||
|
_self.viewPosition = options.viewPosition;
|
||
|
_self.viewPositionEnd = options.viewPositionEnd;
|
||
|
_self.viewDistance = Cesium.Cartesian3.distance(_self.viewPosition, _self.viewPositionEnd);
|
||
|
_self.viewHeading = getHeading(_self.viewPosition, _self.viewPositionEnd);
|
||
|
_self.viewPitch = getPitch(_self.viewPosition, _self.viewPositionEnd);
|
||
|
_self.createLightCamera();
|
||
|
} else {
|
||
|
this.action();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
action() {
|
||
|
let _self = this;
|
||
|
_self.handler.setInputAction(function (movement) {
|
||
|
var cartesian = getCurrentMousePosition(_self.viewer.scene, movement.position);
|
||
|
if (!cartesian) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (_self.posArray.length == 0) {
|
||
|
_self.posArray.push(cartesian);
|
||
|
_self.state = "OPERATING";
|
||
|
} else if (_self.posArray.length == 1) {
|
||
|
_self.viewPosition = _self.posArray[0];
|
||
|
_self.viewPositionEnd = cartesian;
|
||
|
_self.viewDistance = Cesium.Cartesian3.distance(_self.viewPosition, _self.viewPositionEnd);
|
||
|
_self.viewHeading = getHeading(_self.viewPosition, _self.viewPositionEnd);
|
||
|
_self.viewPitch = getPitch(_self.viewPosition, _self.viewPositionEnd);
|
||
|
|
||
|
_self.state = "END";
|
||
|
_self.handler.destroy();
|
||
|
_self.handler = null;
|
||
|
_self.createLightCamera();
|
||
|
}
|
||
|
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
|
||
|
}
|
||
|
|
||
|
//创建相机
|
||
|
createLightCamera() {
|
||
|
this.lightCamera = new Cesium.Camera(this.viewer.scene);
|
||
|
this.lightCamera.position = this.viewPosition;
|
||
|
|
||
|
this.lightCamera.frustum.near = this.viewDistance * 0.0001;
|
||
|
this.lightCamera.frustum.far = this.viewDistance;
|
||
|
const hr = Cesium.Math.toRadians(this.horizontalViewAngle);
|
||
|
const vr = Cesium.Math.toRadians(this.verticalViewAngle);
|
||
|
const aspectRatio =
|
||
|
(this.viewDistance * Math.tan(hr / 2) * 2) /
|
||
|
(this.viewDistance * Math.tan(vr / 2) * 2);
|
||
|
this.lightCamera.frustum.aspectRatio = aspectRatio;
|
||
|
if (hr > vr) {
|
||
|
this.lightCamera.frustum.fov = hr;
|
||
|
} else {
|
||
|
this.lightCamera.frustum.fov = vr;
|
||
|
}
|
||
|
this.lightCamera.setView({
|
||
|
destination: this.viewPosition,
|
||
|
orientation: {
|
||
|
heading: Cesium.Math.toRadians(this.viewHeading || 0),
|
||
|
pitch: Cesium.Math.toRadians(this.viewPitch || 0),
|
||
|
roll: 0
|
||
|
}
|
||
|
});
|
||
|
this.drawFrustumOutline();
|
||
|
}
|
||
|
|
||
|
//创建视锥线
|
||
|
drawFrustumOutline() {
|
||
|
const scratchRight = new Cesium.Cartesian3();
|
||
|
const scratchRotation = new Cesium.Matrix3();
|
||
|
const scratchOrientation = new Cesium.Quaternion();
|
||
|
const position = this.lightCamera.positionWC;
|
||
|
const direction = this.lightCamera.directionWC;
|
||
|
const up = this.lightCamera.upWC;
|
||
|
let right = this.lightCamera.rightWC;
|
||
|
right = Cesium.Cartesian3.negate(right, scratchRight);
|
||
|
let rotation = scratchRotation;
|
||
|
Cesium.Matrix3.setColumn(rotation, 0, right, rotation);
|
||
|
Cesium.Matrix3.setColumn(rotation, 1, up, rotation);
|
||
|
Cesium.Matrix3.setColumn(rotation, 2, direction, rotation);
|
||
|
let orientation = Cesium.Quaternion.fromRotationMatrix(rotation, scratchOrientation);
|
||
|
|
||
|
var newObj = _.cloneDeep(this.lightCamera.frustum);
|
||
|
newObj.near = newObj.far - 0.01;
|
||
|
|
||
|
var videoGeometryInstance1 = new Cesium.GeometryInstance({
|
||
|
geometry: new Cesium.FrustumGeometry({
|
||
|
frustum: newObj,
|
||
|
origin: this.viewPosition,
|
||
|
orientation: orientation
|
||
|
})
|
||
|
});
|
||
|
|
||
|
var p1s = new Cesium.Primitive({
|
||
|
geometryInstances: [videoGeometryInstance1],
|
||
|
appearance: createAppearance()
|
||
|
})
|
||
|
this.viewer.scene.primitives.add(
|
||
|
p1s
|
||
|
);
|
||
|
|
||
|
var videoGeometryInstance2 = new Cesium.GeometryInstance({
|
||
|
geometry: new Cesium.FrustumOutlineGeometry({
|
||
|
frustum: this.lightCamera.frustum,
|
||
|
origin: this.viewPosition,
|
||
|
orientation: orientation
|
||
|
}),
|
||
|
attributes: {
|
||
|
color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE)
|
||
|
}
|
||
|
});
|
||
|
|
||
|
var p2s = new Cesium.Primitive({
|
||
|
geometryInstances: [videoGeometryInstance2],
|
||
|
appearance: new Cesium.PerInstanceColorAppearance(
|
||
|
{
|
||
|
flat: true,
|
||
|
// translucent : false
|
||
|
}
|
||
|
)
|
||
|
})
|
||
|
this.viewer.scene.primitives.add(
|
||
|
p2s
|
||
|
);
|
||
|
this.FrustumGeometry = p1s;
|
||
|
this.FrustumOutlineGeometry = p2s;
|
||
|
videos.push(p1s)
|
||
|
videos.push(p2s)
|
||
|
}
|
||
|
|
||
|
clear() {
|
||
|
this.FrustumGeometry.destroy()
|
||
|
this.FrustumOutlineGeometry.destroy()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
function createAppearance() {
|
||
|
let source = `czm_material czm_getMaterial(czm_materialInput materialInput)
|
||
|
{
|
||
|
czm_material material = czm_getDefaultMaterial(materialInput);
|
||
|
vec2 st = materialInput.st;
|
||
|
vec4 colorImage = texture2D(image, vec2(st.s, st.t));
|
||
|
vec4 maskImage = texture2D(tmask, vec2(st.s, st.t));
|
||
|
material.alpha = colorImage.a * color.a*maskImage.r;
|
||
|
material.diffuse = colorImage.rgb*color.rgb;
|
||
|
return material;
|
||
|
}`;
|
||
|
let material = new Cesium.Material({
|
||
|
fabric: {
|
||
|
type: "custome_1",
|
||
|
uniforms: {
|
||
|
color: new Cesium.Color(1.0, 1.0, 1.0, 1.0),
|
||
|
image: "data:image/png;base64,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
|
||
|
tmask: "data:image/jpg;base64,/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEAAQBIAAAAAQAB/+Ekcmh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wR0ltZz0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL2cvaW1nLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczppbGx1c3RyYXRvcj0iaHR0cDovL25zLmFkb2JlLmNvbS9pbGx1c3RyYXRvci8xLjAvIgogICAgICAgICAgICB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL2pwZWc8L2RjOmZvcm1hdD4KICAgICAgICAgPGRjOnRpdGxlPgogICAgICAgICAgICA8cmRmOkFsdD4KICAgICAgICAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij7miZPljbA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6QWx0PgogICAgICAgICA8L2RjOnRpdGxlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE5LTEyLTE4VDE3OjA4OjU5KzA4OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOS0xMi0xOFQwOTowODo1OVo8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxOS0xMi0xOFQxNzowODo1OSswODowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgSWxsdXN0cmF0b3IgQ0MgMjMuMSAoTWFjaW50b3NoKTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8eG1wOlRodW1ibmFpbHM+CiAgICAgICAgICAgIDxyZGY6QWx0PgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHhtcEdJbWc6d2lkdGg+MjU2PC94bXBHSW1nOndpZHRoPgogICAgICAgICAgICAgICAgICA8eG1wR0ltZzpoZWlnaHQ+NzY8L3htcEdJbWc6aGVpZ2h0PgogICAgICAgICAgICAgICAgICA8eG1wR0ltZzpmb3JtYXQ+SlBFRzwveG1wR0ltZzpmb3JtYXQ+CiAgICAgICAgICAgICAgICAgIDx4bXBHSW1nOmltYWdlPi85ai80QUFRU2taSlJnQUJBZ0VBU0FCSUFBRC83UUFzVUdodmRHOXphRzl3SURNdU1BQTRRa2xOQSswQUFBQUFBQkFBU0FBQUFBRUEmI3hBO0FRQklBQUFBQVFBQi8rNEFEa0ZrYjJKbEFHVEFBQUFBQWYvYkFJUUFCZ1FFQkFVRUJnVUZCZ2tHQlFZSkN3Z0dCZ2dMREFvS0N3b0smI3hBO0RCQU1EQXdNREF3UURBNFBFQThPREJNVEZCUVRFeHdiR3hzY0h4OGZIeDhmSHg4Zkh3RUhCd2NOREEwWUVCQVlHaFVSRlJvZkh4OGYmI3hBO0h4OGZIeDhmSHg4Zkh4OGZIeDhmSHg4Zkh4OGZIeDhmSHg4Zkh4OGZIeDhmSHg4Zkh4OGZIeDhmSHg4Zi84QUFFUWdBVEFFQUF3RVImI3hBO0FBSVJBUU1SQWYvRUFhSUFBQUFIQVFFQkFRRUFBQUFBQUFBQUFBUUZBd0lHQVFBSENBa0tDd0VBQWdJREFRRUJBUUVBQUFBQUFBQUEmI3hBO0FRQUNBd1FGQmdjSUNRb0xFQUFDQVFNREFnUUNCZ2NEQkFJR0FuTUJBZ01SQkFBRklSSXhRVkVHRTJFaWNZRVVNcEdoQnhXeFFpUEImI3hBO1V0SGhNeFppOENSeWd2RWxRelJUa3FLeVkzUENOVVFuazZPek5oZFVaSFREMHVJSUpvTUpDaGdaaEpSRlJxUzBWdE5WS0JyeTQvUEUmI3hBOzFPVDBaWFdGbGFXMXhkWGw5V1oyaHBhbXRzYlc1dlkzUjFkbmQ0ZVhwN2ZIMStmM09FaFlhSGlJbUtpNHlOam8rQ2s1U1ZscGVZbVomI3hBO3FibkoyZW41S2pwS1dtcDZpcHFxdXNyYTZ2b1JBQUlDQVFJREJRVUVCUVlFQ0FNRGJRRUFBaEVEQkNFU01VRUZVUk5oSWdaeGdaRXkmI3hBO29iSHdGTUhSNFNOQ0ZWSmljdkV6SkRSRGdoYVNVeVdpWTdMQ0IzUFNOZUpFZ3hkVWt3Z0pDaGdaSmpaRkdpZGtkRlUzOHFPend5Z3AmI3hBOzArUHpoSlNrdE1UVTVQUmxkWVdWcGJYRjFlWDFSbFptZG9hV3ByYkcxdWIyUjFkbmQ0ZVhwN2ZIMStmM09FaFlhSGlJbUtpNHlOam8mI3hBOytEbEpXV2w1aVptcHVjblo2ZmtxT2twYWFucUttcXE2eXRycSt2L2FBQXdEQVFBQ0VRTVJBRDhBRmZsWCtYbWkrYU5Qalc1aVZad3QmI3hBO2ZVcDFvTytSRElsNkYvMEx4NWY4VSs3K3pEU0xkLzBMeDVmOFUrNyt6R2x0My9RdkhsL3hUN3Y3TWFXM2Y5QzhlWC9GUHUvc3hwYmQmI3hBOy93QkM4ZVgvQUJUN3Y3TWFXM2Y5QzhlWC9GUHUvc3hwYmQvMEx4NWY4VSs3K3pHbHQzL1F2SGwveFQ3djdNYVczZjhBUXZIbC93QVUmI3hBOys3K3pHbHQzL1F2SGwveFQ3djdNYVcwdTE3OGovTHVrNmJMZXNxU2NCc29IZW1OSnRPZitjZFk0NC9LbXN4eHFGUmRabUNxTmdCOVYmI3hBO3RzUWd2VmNLSFlxN0ZYWXE3RlhZcThRLzV5Ny9BUEpiYWIvMjJZUCtvVzV3RmxGODNlUi95eTg0ZWVQcnYrSExSTHI5SCtsOWE1eXgmI3hBO3hjZlg1OEtlb3kxcjZUZE1ESWxsWC9RczM1d2Y5V3FIL3BMdHYrYThhUmJ2K2hadnpnLzZ0VVAvQUVsMjMvTmVOTGJ2K2hadnpnLzYmI3hBO3RVUC9BRWwyMy9OZU5MYnYraFp2emcvN
|
||
|
},
|
||
|
source: source
|
||
|
}
|
||
|
});
|
||
|
material.uniforms.image = video_dom;
|
||
|
let appearance = new Cesium.EllipsoidSurfaceAppearance({
|
||
|
material: material,
|
||
|
flat: true,
|
||
|
renderState: {
|
||
|
cull: {
|
||
|
enabled: false,
|
||
|
},
|
||
|
depthTest: {
|
||
|
enabled: false
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
return appearance;
|
||
|
}
|
||
|
|
||
|
//获取偏航角
|
||
|
function getHeading(fromPosition, toPosition) {
|
||
|
let finalPosition = new Cesium.Cartesian3();
|
||
|
let matrix4 = Cesium.Transforms.eastNorthUpToFixedFrame(fromPosition);
|
||
|
Cesium.Matrix4.inverse(matrix4, matrix4);
|
||
|
Cesium.Matrix4.multiplyByPoint(matrix4, toPosition, finalPosition);
|
||
|
Cesium.Cartesian3.normalize(finalPosition, finalPosition);
|
||
|
return Cesium.Math.toDegrees(Math.atan2(finalPosition.x, finalPosition.y));
|
||
|
}
|
||
|
|
||
|
//获取俯仰角
|
||
|
function getPitch(fromPosition, toPosition) {
|
||
|
let finalPosition = new Cesium.Cartesian3();
|
||
|
let matrix4 = Cesium.Transforms.eastNorthUpToFixedFrame(fromPosition);
|
||
|
Cesium.Matrix4.inverse(matrix4, matrix4);
|
||
|
Cesium.Matrix4.multiplyByPoint(matrix4, toPosition, finalPosition);
|
||
|
Cesium.Cartesian3.normalize(finalPosition, finalPosition);
|
||
|
return Cesium.Math.toDegrees(Math.asin(finalPosition.z));
|
||
|
}
|
||
|
|