learning_cesium/Camera对象.html

563 lines
14 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<!-- Use correct character set. -->
<meta charset="utf-8">
<!-- Tell IE to use the latest, best version. -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<title>Learning Cesium!</title>
<script src="./Build/Cesium/Cesium.js"></script>
<style>
@import url(./Build/Cesium/Widgets/widgets.css);
html,
body,
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
#credit {
display: none;
}
#viewChanged,
#cameraChanged {
display: none;
background-color: red;
color: white;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<div id="loadingOverlay">
<h1>Loading...</h1>
</div>
<div id="toolbar">
<div id="viewChanged">View Changed</div>
<div id="cameraChanged">Camera Changed</div>
</div>
<div id="credit"></div>
<script>
Cesium.Ion.defaultAccessToken =
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5ZjRjNTZkNC01NDYxLTRhMjQtOGEwZC1kZjA3YzQ5YTJlZDkiLCJpZCI6MjYwODQsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1ODcxOTMwODN9.prGsSKyAW_9Ow5zHYPhbm3LsQL-ApQw5-5PNJkDaHi8';
var viewer = new Cesium.Viewer('cesiumContainer', {
scene3DOnly: true,
selectionIndicator: false,
baseLayerPicker: false
});
// 移除默认的底图
viewer.imageryLayers.remove(viewer.imageryLayers.get(0));
// 添加哨兵影像 Sentinel-2 imagery
viewer.imageryLayers.addImageryProvider(new Cesium.IonImageryProvider({
assetId: 3954
}));
viewer.terrainProvider = Cesium.createWorldTerrain({
requestWaterMask: true, // required for water effects
requestVertexNormals: true // required for terrain lighting
});
//添加参考实体
var citizensBankPark = viewer.entities.add({
name: 'Citizens Bank Park',
position: Cesium.Cartesian3.fromDegrees(113.930, 22.5391),
point: {
pixelSize: 5,
color: Cesium.Color.RED,
outlineColor: Cesium.Color.WHITE,
outlineWidth: 2
},
label: {
text: 'Citizens Bank Park',
font: '14pt monospace',
style: Cesium.LabelStyle.FILL_AND_OUTLINE,
outlineWidth: 2,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
pixelOffset: new Cesium.Cartesian2(0, -9)
}
});
/**
* viewer.camera.lookAt(target, offset)
* target 必须是笛卡尔坐标;
* offset 可以是笛卡尔坐标也可以是 HeadingPitchRange
*
*/
// 1. Using a cartesian offset
var center = Cesium.Cartesian3.fromDegrees(113.930, 22.5391);
// viewer.camera.lookAt(center, new Cesium.Cartesian3(-10000.0, 1000.0, 50000));
// 2. Using a HeadingPitchRange offset
var heading = Cesium.Math.toRadians(100);
var pitch = Cesium.Math.toRadians(20);
var range = 10000.0;
// viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, range));
/**
* Camera.setView(options) 设置位置、方向、转换
* options配置参数
* destinationCartesian3 | Rectangle 在WGS84中 Camera 的最终位置坐标或从自上而下视图中可见的矩形。
* orientationObject 包含方向和向上属性或航向、俯仰和滚动属性的对象。
*
*/
// 1. Set position with a top-down view
// viewer.camera.setView({
// destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0)
// });
// 2 Set view with heading, pitch and roll
// viewer.camera.setView({
// destination : center,
// orientation: {
// heading : Cesium.Math.toRadians(90.0), // east, default value is 0.0 (north)
// pitch : Cesium.Math.toRadians(-90), // default value (looking down)
// roll : 0.0 // default value
// }
// });
//3. Change heading, pitch and roll with the camera position remaining the same.
// viewer.camera.setView({
// orientation: {
// heading : Cesium.Math.toRadians(90.0), // east, default value is 0.0 (north)
// pitch : Cesium.Math.toRadians(-90), // default value (looking down)
// roll : 0.0 // default value
// }
// })
// 4. View rectangle with a top-down view
// viewer.camera.setView({
// destination : Cesium.Rectangle.fromDegrees(113.930-1, 22.5391-1, 113.930+1, 22.5391+1)
// });
// 5. Set position with an orientation using unit vectors.
// viewer.camera.setView({
// destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0),
// orientation : {
// direction : new Cesium.Cartesian3(-0.04231243104240401, -0.20123236049443421, -0.97862924300734),
// up : new Cesium.Cartesian3(-0.47934589305293746, -0.8553216253114552, 0.1966022179118339)
// }
// });
var scene = viewer.scene;
var clock = viewer.clock;
var referenceFramePrimitive;
function flyToSanDiego() {
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0),
});
}
function flyToHeadingPitchRoll() {
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(-122.22, 46.12, 5000.0),
orientation: {
heading: Cesium.Math.toRadians(20.0),
pitch: Cesium.Math.toRadians(-35.0),
roll: 0.0,
},
});
}
function flyToLocation() {
// Create callback for browser's geolocation
function fly(position) {
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(
position.coords.longitude,
position.coords.latitude,
1000.0
),
});
}
// Ask browser for location, and fly there.
navigator.geolocation.getCurrentPosition(fly);
}
function viewRectangle() {
var west = -77.0;
var south = 38.0;
var east = -72.0;
var north = 42.0;
var rectangle = Cesium.Rectangle.fromDegrees(west,south,east,north);
viewer.camera.setView({
destination: rectangle,
});
// Show the rectangle. Not required; just for show.
viewer.entities.add({
rectangle: {
coordinates: rectangle,
fill: false,
outline: true,
outlineColor: Cesium.Color.WHITE,
},
});
}
function flyToRectangle() {
var west = -90.0;
var south = 38.0;
var east = -87.0;
var north = 40.0;
var rectangle = Cesium.Rectangle.fromDegrees(west,south,east,north);
viewer.camera.flyTo({
destination: rectangle,
});
// Show the rectangle. Not required; just for show.
viewer.entities.add({
rectangle: {
coordinates: rectangle,
fill: false,
outline: true,
outlineColor: Cesium.Color.WHITE,
},
});
}
function setReferenceFrame() {
var center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);
var transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);
// View in east-north-up frame
var camera = viewer.camera;
camera.constrainedAxis = Cesium.Cartesian3.UNIT_Z;
camera.lookAtTransform(
transform,
new Cesium.Cartesian3(-120000.0, -120000.0, 120000.0)
);
// Show reference frame. Not required.
referenceFramePrimitive = scene.primitives.add(
new Cesium.DebugModelMatrixPrimitive({
modelMatrix: transform,
length: 100000.0,
})
);
}
function setHeadingPitchRoll() {
var camera = viewer.camera;
camera.setView({
destination: Cesium.Cartesian3.fromDegrees(
-75.5847,
40.0397,
1000.0
),
orientation: {
heading: -Cesium.Math.PI_OVER_TWO,
pitch: -Cesium.Math.PI_OVER_FOUR,
roll: 0.0,
},
});
}
function icrf(scene, time) {
if (scene.mode !== Cesium.SceneMode.SCENE3D) {
return;
}
var icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time);
if (Cesium.defined(icrfToFixed)) {
var camera = viewer.camera;
var offset = Cesium.Cartesian3.clone(camera.position);
var transform = Cesium.Matrix4.fromRotationTranslation(icrfToFixed);
camera.lookAtTransform(transform, offset);
}
}
function viewInICRF() {
viewer.camera.flyHome(0);
clock.multiplier = 3 * 60 * 60;
scene.postUpdate.addEventListener(icrf);
scene.globe.enableLighting = true;
}
var viewChanged = document.getElementById("viewChanged");
var removeStart;
var removeEnd;
function cameraEvents() {
var camera = viewer.camera;
removeStart = camera.moveStart.addEventListener(function() {
viewChanged.style.display = "block";
});
removeEnd = camera.moveEnd.addEventListener(function() {
viewChanged.style.display = "none";
});
}
var cameraChanged = document.getElementById("cameraChanged");
var removeChanged;
function cameraChanges() {
var i = 0;
removeChanged = viewer.camera.changed.addEventListener(function(
percentage
) {
++i;
cameraChanged.innerText =
"Camera Changed: " + i + ", " + percentage.toFixed(6);
cameraChanged.style.display = "block";
});
}
function flyInACity() {
var camera = scene.camera;
camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(
-73.98580932617188,
40.74843406689482,
363.34038727246224
),
complete: function() {
setTimeout(function() {
camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(
-73.98585975679403,
40.75759944127251,
186.50838555841779
),
orientation: {
heading: Cesium.Math.toRadians(200.0),
pitch: Cesium.Math.toRadians(-50.0),
},
easingFunction: Cesium.EasingFunction.LINEAR_NONE,
});
}, 1000);
},
});
}
function losAngelesToTokyo(adjustPitch) {
var camera = scene.camera;
var tokyoOptions = {
destination: Cesium.Cartesian3.fromDegrees(
139.8148,
35.7142,
20000.0
),
orientation: {
heading: Cesium.Math.toRadians(15.0),
pitch: Cesium.Math.toRadians(-60),
roll: 0.0,
},
duration: 20,
flyOverLongitude: Cesium.Math.toRadians(60.0),
};
var laOptions = {
destination: Cesium.Cartesian3.fromDegrees(
-117.729,
34.457,
10000.0
),
duration: 5,
orientation: {
heading: Cesium.Math.toRadians(-15.0),
pitch: -Cesium.Math.PI_OVER_FOUR,
roll: 0.0,
},
};
laOptions.complete = function() {
setTimeout(function() {
camera.flyTo(tokyoOptions);
}, 1000);
};
if (adjustPitch) {
tokyoOptions.pitchAdjustHeight = 1000;
laOptions.pitchAdjustHeight = 1000;
}
camera.flyTo(laOptions);
}
function flyOverLongitude(adjustPitch) {
losAngelesToTokyo();
}
function flyOverLongitudeWithPitch() {
losAngelesToTokyo(true);
}
var Sandcastle = window;
Sandcastle.addToolbarMenu([{
text: "Camera Options",
},
{
text: "Fly in a city",
onselect: function() {
reset();
flyInACity();
Sandcastle.highlight(flyInACity);
},
},
{
text: "Fly to San Diego",
onselect: function() {
reset();
flyToSanDiego();
Sandcastle.highlight(flyToSanDiego);
},
},
{
text: "Fly to Location with heading, pitch and roll",
onselect: function() {
reset();
flyToHeadingPitchRoll();
Sandcastle.highlight(flyToHeadingPitchRoll);
},
},
{
text: "Fly to My Location",
onselect: function() {
reset();
flyToLocation();
Sandcastle.highlight(flyToLocation);
},
},
{
text: "Fly to Rectangle",
onselect: function() {
reset();
flyToRectangle();
Sandcastle.highlight(flyToRectangle);
},
},
{
text: "View a Rectangle",
onselect: function() {
reset();
viewRectangle();
Sandcastle.highlight(viewRectangle);
},
},
{
text: "Set camera reference frame",
onselect: function() {
reset();
setReferenceFrame();
Sandcastle.highlight(setReferenceFrame);
},
},
{
text: "Set camera with heading, pitch, and roll",
onselect: function() {
reset();
setHeadingPitchRoll();
Sandcastle.highlight(setHeadingPitchRoll);
},
},
{
text: "View in ICRF",
onselect: function() {
reset();
viewInICRF();
Sandcastle.highlight(viewInICRF);
},
},
{
text: "Move events",
onselect: function() {
reset();
cameraEvents();
Sandcastle.highlight(cameraEvents);
},
},
{
text: "Camera changed event",
onselect: function() {
reset();
cameraChanges();
Sandcastle.highlight(cameraChanges);
},
},
{
text: "Fly from Los Angeles to Tokyo via Europe",
onselect: function() {
reset();
flyOverLongitude();
Sandcastle.highlight(flyOverLongitude);
},
},
{
text: "Look down during exaggerated flight",
onselect: function() {
reset();
flyOverLongitudeWithPitch();
Sandcastle.highlight(flyOverLongitudeWithPitch);
},
},
]);
Sandcastle.addToolbarButton("Complete Flight", function() {
scene.camera.completeFlight();
});
Sandcastle.addToolbarButton("Cancel Flight", function() {
scene.camera.cancelFlight();
});
function reset() {
scene.completeMorph();
viewer.entities.removeAll();
scene.primitives.remove(referenceFramePrimitive);
scene.tweens.removeAll();
if (Cesium.defined(removeStart)) {
removeStart();
removeEnd();
viewChanged.style.display = "none";
removeStart = undefined;
removeEnd = undefined;
}
if (Cesium.defined(removeChanged)) {
removeChanged();
removeChanged = undefined;
cameraChanged.style.display = "none";
}
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
clock.multiplier = 1.0;
scene.postUpdate.removeEventListener(icrf);
scene.globe.enableLighting = false;
}
scene.morphComplete.addEventListener(function() {
reset();
});
</script>
</body>
</html>