Cesium-Examples/examples/cesiumEx/video.js

297 lines
40 KiB
JavaScript
Raw Normal View History

2025-03-11 08:25:45 +00:00
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));
}