Skip to content

Commit ebab05f

Browse files
committed
Merge pull request #3100 from AnalyticalGraphicsInc/cameraSetView
Make Camera.setView options consistent with Camera.flyTo
2 parents 3b250dc + b60eec4 commit ebab05f

File tree

11 files changed

+473
-421
lines changed

11 files changed

+473
-421
lines changed

Apps/CesiumViewer/CesiumViewer.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,12 @@ define([
156156
var roll = ((splitQuery.length > 5) && (!isNaN(+splitQuery[5]))) ? CesiumMath.toRadians(+splitQuery[5]) : undefined;
157157

158158
viewer.camera.setView({
159-
position: Cartesian3.fromDegrees(longitude, latitude, height),
160-
heading: heading,
161-
pitch: pitch,
162-
roll: roll
159+
destination: Cartesian3.fromDegrees(longitude, latitude, height),
160+
orientation: {
161+
heading: heading,
162+
pitch: pitch,
163+
roll: roll
164+
}
163165
});
164166
}
165167
}

Apps/Sandcastle/gallery/Camera.html

+5-3
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,11 @@
139139
var camera = viewer.camera;
140140
camera.setView({
141141
position : Cesium.Cartesian3.fromDegrees(-75.5847, 40.0397, 1000.0),
142-
heading : -Cesium.Math.PI_OVER_TWO,
143-
pitch : -Cesium.Math.PI_OVER_FOUR,
144-
roll : 0.0
142+
orientation: {
143+
heading : -Cesium.Math.PI_OVER_TWO,
144+
pitch : -Cesium.Math.PI_OVER_FOUR,
145+
roll : 0.0
146+
}
145147
});
146148
}
147149

CHANGES.md

+6
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,18 @@ Change Log
1616
* Deprecated `PerspectiveOffCenterFrustum.getPixelSize`, use `PerspectiveOffCenterFrustum.getPixelDimensions` instead. It will be removed in 1.17.
1717
* Deprecated `Scene\HeadingPitchRange`, use `Core\HeadingPitchRange` instead. It will be removed in 1.17.
1818
* Deprecated `jsonp` use `loadJsonp` instead. It will be removed in 1.17.
19+
* Deprecated `Camera.viewRectangle`, use `Camera.setView({destination: rectangle})` instead. It will be removed in 1.17.
20+
* The following options to `Camera.setView` have been deprecated and will be removed in 1.17:
21+
* `position`: use `destination` instead.
22+
* `positionCartographic`: convert to a `Cartesian3` and use `destination` instead.
23+
* `heading`, `pitch` and `roll`: use `orientation.heading/pitch/roll` instead.
1924
* Decreased GPU memory usage in `BillboardCollection` and `LabelCollection` by using the WebGL ANGLE_instanced_arrays extension.
2025
* Added CZML examples to Sandcastle. See the new CZML tab.
2126
* Fixed token issue in `ArcGisMapServerImageryProvider`.
2227
* `ImageryLayerFeatureInfo` now has an `imageryLayer` property, indicating the layer that contains the feature.
2328
* Added `BoxOutlineGeometry.fromAxisAlignedBoundingBox` and `BoxGeometry.fromAxisAlignedBoundingBox` functions.
2429
* The WebGL setting of `failIfMajorPerformanceCaveat` now defaults to `false`, which is the official WebGL default. This improves compatibility with out-of-date drivers and remote desktop sessions. Cesium will run slower in these cases instead of simply failing to load.
30+
* Changed `Camera.setView` to take the same parameter options as `Camera.flyTo`. `options.destination` takes a rectangle, `options.orientation` works with heading/pitch/roll or direction/up, and `options.endTransform` was added.
2531

2632
### 1.14 - 2015-10-01
2733

Source/Scene/Camera.js

+232-186
Large diffs are not rendered by default.

Source/Scene/CameraFlightPath.js

+33-28
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,11 @@ define([
125125
var time = value.time / duration;
126126

127127
camera.setView({
128-
heading : CesiumMath.lerp(startHeading, heading, time),
129-
pitch : CesiumMath.lerp(startPitch, pitch, time),
130-
roll : CesiumMath.lerp(startRoll, roll, time)
128+
orientation: {
129+
heading : CesiumMath.lerp(startHeading, heading, time),
130+
pitch : CesiumMath.lerp(startPitch, pitch, time),
131+
roll : CesiumMath.lerp(startRoll, roll, time)
132+
}
131133
});
132134

133135
Cartesian2.lerp(start, destination, time, camera.position);
@@ -139,7 +141,7 @@ define([
139141

140142
var scratchStartCart = new Cartographic();
141143
var scratchEndCart = new Cartographic();
142-
var scratchCurrentPositionCart = new Cartographic();
144+
var scratchCurrentPositionCart = new Cartesian3();
143145

144146
function createUpdate3D(scene, duration, destination, heading, pitch, roll, optionAltitude) {
145147
var camera = scene.camera;
@@ -171,16 +173,19 @@ define([
171173
var update = function(value) {
172174
var time = value.time / duration;
173175

174-
var position = scratchCurrentPositionCart;
175-
position.longitude = CesiumMath.lerp(startCart.longitude, destCart.longitude, time);
176-
position.latitude = CesiumMath.lerp(startCart.latitude, destCart.latitude, time);
177-
position.height = heightFunction(time);
176+
var position = Cartesian3.fromRadians(
177+
CesiumMath.lerp(startCart.longitude, destCart.longitude, time),
178+
CesiumMath.lerp(startCart.latitude, destCart.latitude, time),
179+
heightFunction(time)
180+
);
178181

179182
camera.setView({
180-
positionCartographic : position,
181-
heading : CesiumMath.lerp(startHeading, heading, time),
182-
pitch : CesiumMath.lerp(startPitch, pitch, time),
183-
roll : CesiumMath.lerp(startRoll, roll, time)
183+
destination : position,
184+
orientation: {
185+
heading : CesiumMath.lerp(startHeading, heading, time),
186+
pitch : CesiumMath.lerp(startPitch, pitch, time),
187+
roll : CesiumMath.lerp(startRoll, roll, time)
188+
}
184189
});
185190
};
186191

@@ -191,9 +196,7 @@ define([
191196
var camera = scene.camera;
192197

193198
var start = Cartesian3.clone(camera.position, scratchStart);
194-
var startPitch = camera.pitch;
195199
var startHeading = adjustAngleForLERP(camera.heading, heading);
196-
var startRoll = adjustAngleForLERP(camera.roll, roll);
197200

198201
var startHeight = camera.frustum.right - camera.frustum.left;
199202
var heightFunction = createHeightFunction(camera, destination, startHeight, destination.z, optionAltitude);
@@ -202,9 +205,9 @@ define([
202205
var time = value.time / duration;
203206

204207
camera.setView({
205-
heading : CesiumMath.lerp(startHeading, heading, time),
206-
pitch : CesiumMath.lerp(startPitch, pitch, time),
207-
roll : CesiumMath.lerp(startRoll, roll, time)
208+
orientation: {
209+
heading : CesiumMath.lerp(startHeading, heading, time)
210+
}
208211
});
209212

210213
Cartesian2.lerp(start, destination, time, camera.position);
@@ -263,20 +266,19 @@ define([
263266
throw new DeveloperError('destination is required.');
264267
}
265268
//>>includeEnd('debug');
269+
var mode = scene.mode;
266270

267-
var projection = scene.mapProjection;
268-
var ellipsoid = projection.ellipsoid;
269-
270-
var maximumHeight = options.maximumHeight;
271-
var easingFunction = options.easingFunction;
272-
273-
if (scene.mode === SceneMode.MORPHING) {
271+
if (mode === SceneMode.MORPHING) {
274272
return emptyFlight();
275273
}
276274

277275
var convert = defaultValue(options.convert, true);
276+
var projection = scene.mapProjection;
277+
var ellipsoid = projection.ellipsoid;
278+
var maximumHeight = options.maximumHeight;
279+
var easingFunction = options.easingFunction;
278280

279-
if (convert && scene.mode !== SceneMode.SCENE3D) {
281+
if (convert && mode !== SceneMode.SCENE3D) {
280282
ellipsoid.cartesianToCartographic(destination, scratchCartographic);
281283
destination = projection.project(scratchCartographic, scratchDestination);
282284
}
@@ -293,9 +295,8 @@ define([
293295
duration = Math.min(duration, 3.0);
294296
}
295297

296-
var mode = scene.mode;
297298
var heading = defaultValue(options.heading, 0.0);
298-
var pitch = scene.mode !== SceneMode.SCENE2D ? defaultValue(options.pitch, -CesiumMath.PI_OVER_TWO) : -CesiumMath.PI_OVER_TWO;
299+
var pitch = defaultValue(options.pitch, -CesiumMath.PI_OVER_TWO);
299300
var roll = defaultValue(options.roll, 0.0);
300301

301302
var controller = scene.screenSpaceCameraController;
@@ -310,7 +311,11 @@ define([
310311
empty = empty && Cartesian2.equalsEpsilon(camera.position, destination, CesiumMath.EPSILON6);
311312
empty = empty && CesiumMath.equalsEpsilon(Math.max(frustum.right - frustum.left, frustum.top - frustum.bottom), destination.z, CesiumMath.EPSILON6);
312313

313-
empty = empty || (scene.mode !== SceneMode.SCENE2D && Cartesian3.equalsEpsilon(destination, camera.position, CesiumMath.EPSILON6));
314+
empty = empty || (scene.mode !== SceneMode.SCENE2D &&
315+
Cartesian3.equalsEpsilon(destination, camera.position, CesiumMath.EPSILON10) &&
316+
CesiumMath.equalsEpsilon(CesiumMath.negativePiToPi(heading), CesiumMath.negativePiToPi(camera.heading), CesiumMath.EPSILON10) &&
317+
CesiumMath.equalsEpsilon(CesiumMath.negativePiToPi(pitch), CesiumMath.negativePiToPi(camera.pitch), CesiumMath.EPSILON10) &&
318+
CesiumMath.equalsEpsilon(CesiumMath.negativePiToPi(roll), CesiumMath.negativePiToPi(camera.roll), CesiumMath.EPSILON10));
314319

315320
if (empty) {
316321
return emptyFlight(complete, cancel);

Source/Widgets/Geocoder/GeocoderViewModel.js

+9-23
Original file line numberDiff line numberDiff line change
@@ -203,30 +203,16 @@ define([
203203
}
204204
});
205205

206-
var scratchPosition = new Cartesian3();
207206
function updateCamera(viewModel, destination) {
208-
var scene = viewModel._scene;
209-
if (viewModel._flightDuration === 0) {
210-
var isRectangle = defined(destination.west);
211-
if (isRectangle) {
212-
if (scene.scene.mode !== SceneMode.SCENE3D && destination.west > destination.east) {
213-
destination = Rectangle.MAX_VALUE;
214-
}
215-
destination = scene.camera.getRectangleCameraCoordinates(destination, scratchPosition);
216-
}
217-
viewModel._scene.camera.setView({position: destination});
218-
viewModel._complete.raiseEvent();
219-
} else {
220-
viewModel._scene.camera.flyTo({
221-
destination : destination,
222-
complete: function() {
223-
viewModel._complete.raiseEvent();
224-
},
225-
duration : viewModel._flightDuration,
226-
endTransform : Matrix4.IDENTITY,
227-
convert : false
228-
});
229-
}
207+
viewModel._scene.camera.flyTo({
208+
destination : destination,
209+
complete: function() {
210+
viewModel._complete.raiseEvent();
211+
},
212+
duration : viewModel._flightDuration,
213+
endTransform : Matrix4.IDENTITY,
214+
convert : false
215+
});
230216
}
231217

232218
function geocode(viewModel) {

Source/Widgets/HomeButton/HomeButtonViewModel.js

+2-8
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ define([
2525
createCommand) {
2626
"use strict";
2727

28+
var pitchScratch = new Cartesian3();
2829
function viewHome(scene, duration) {
2930
var mode = scene.mode;
3031

@@ -48,26 +49,19 @@ define([
4849

4950
scene.camera.flyTo({
5051
destination : destination,
51-
orientation : {
52-
heading : 0.0,
53-
pitch : -Math.PI * 0.5,
54-
roll : 0.0
55-
},
5652
duration : duration,
5753
endTransform : Matrix4.IDENTITY
5854
});
5955
} else if (mode === SceneMode.COLUMBUS_VIEW) {
6056
var maxRadii = scene.globe.ellipsoid.maximumRadius;
6157
var position = new Cartesian3(0.0, -1.0, 1.0);
6258
position = Cartesian3.multiplyByScalar(Cartesian3.normalize(position, position), 5.0 * maxRadii, position);
63-
var pitch = -Math.acos(Cartesian3.normalize(position, new Cartesian3()).z);
64-
6559
scene.camera.flyTo({
6660
destination : position,
6761
duration : duration,
6862
orientation : {
6963
heading : 0.0,
70-
pitch : pitch,
64+
pitch : -Math.acos(Cartesian3.normalize(position, pitchScratch).z),
7165
roll : 0.0
7266
},
7367
endTransform : Matrix4.IDENTITY,

Specs/Scene/CameraFlightPathSpec.js

+23-15
Original file line numberDiff line numberDiff line change
@@ -202,26 +202,26 @@ defineSuite([
202202
it('does not create a path to the same point', function() {
203203
var camera = scene.camera;
204204
camera.position = new Cartesian3(7000000.0, 0.0, 0.0);
205-
camera.direction = Cartesian3.negate(Cartesian3.normalize(camera.position, new Cartesian3()), new Cartesian3());
206-
camera.up = Cartesian3.clone(Cartesian3.UNIT_Z);
207-
camera.right = Cartesian3.normalize(Cartesian3.cross(camera.direction, camera.up, new Cartesian3()), new Cartesian3());
208205

209206
var startPosition = Cartesian3.clone(camera.position);
210-
var startDirection = Cartesian3.clone(camera.direction);
211-
var startUp = Cartesian3.clone(camera.up);
207+
var startHeading= camera.heading;
208+
var startPitch = camera.pitch;
209+
var startRoll = camera.roll;
212210

213211
var duration = 3.0;
214212
var flight = CameraFlightPath.createTween(scene, {
215213
destination : startPosition,
216-
direction : startDirection,
217-
up : startUp,
214+
heading : startHeading,
215+
pitch : startPitch,
216+
roll: startRoll,
218217
duration : duration
219218
});
220219

221220
expect(flight.duration).toEqual(0);
222221
expect(camera.position).toEqual(startPosition);
223-
expect(camera.direction).toEqual(startDirection);
224-
expect(camera.up).toEqual(startUp);
222+
expect(camera.heading).toEqual(startHeading);
223+
expect(camera.pitch).toEqual(startPitch);
224+
expect(camera.roll).toEqual(startRoll);
225225
});
226226

227227
it('creates an animation with 0 duration', function() {
@@ -273,9 +273,13 @@ defineSuite([
273273
var camera = scene.camera;
274274

275275
camera.position = new Cartesian3(0.0, 0.0, 1000.0);
276-
camera.direction = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3());
277-
camera.up = Cartesian3.clone(Cartesian3.UNIT_Y);
278-
camera.right = Cartesian3.cross(camera.direction, camera.up, new Cartesian3());
276+
camera.setView({
277+
orientation: {
278+
heading: 0,
279+
pitch: -CesiumMath.PI_OVER_TWO,
280+
roll: 0
281+
}
282+
});
279283
camera.frustum = createOrthographicFrustum();
280284

281285
var flight = CameraFlightPath.createTween(scene, {
@@ -290,9 +294,13 @@ defineSuite([
290294
var camera = scene.camera;
291295

292296
camera.position = new Cartesian3(0.0, 0.0, 1000.0);
293-
camera.direction = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3());
294-
camera.up = Cartesian3.clone(Cartesian3.UNIT_Y);
295-
camera.right = Cartesian3.cross(camera.direction, camera.up, new Cartesian3());
297+
camera.setView({
298+
orientation: {
299+
heading: 0,
300+
pitch: -CesiumMath.PI_OVER_TWO,
301+
roll: 0
302+
}
303+
});
296304

297305
var projection = scene.mapProjection;
298306
var endPosition = projection.ellipsoid.cartographicToCartesian(projection.unproject(camera.position));

0 commit comments

Comments
 (0)