terriajs
Version:
Geospatial data visualization platform.
355 lines (315 loc) • 10.4 kB
JavaScript
;
import CameraView from "../../lib/Models/CameraView";
import Cartesian3 from "terriajs-cesium/Source/Core/Cartesian3";
import Cartographic from "terriajs-cesium/Source/Core/Cartographic";
import CesiumMath from "terriajs-cesium/Source/Core/Math";
import CustomMatchers from "../Utility/CustomMatchers";
import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid";
import HeadingPitchRange from "terriajs-cesium/Source/Core/HeadingPitchRange";
import Rectangle from "terriajs-cesium/Source/Core/Rectangle";
describe("CameraView", function () {
describe("fromJson", function () {
it("can deserialize rectangle alone", function () {
var view = CameraView.fromJson({
west: 45,
south: -20,
east: 55,
north: -10
});
expect(view.rectangle).toEqual(Rectangle.fromDegrees(45, -20, 55, -10));
});
it("can deserialize rectangle plus position/direction/up", function () {
var view = CameraView.fromJson({
west: 45,
south: -20,
east: 55,
north: -10,
position: {
x: 10000000,
y: 10.0,
z: 20.0
},
direction: {
x: -1.0,
y: 0.1,
z: 0.2
},
up: {
x: 0.0,
y: 1.0,
z: 0.1
}
});
expect(view.rectangle).toEqual(Rectangle.fromDegrees(45, -20, 55, -10));
expect(view.position).toEqual(new Cartesian3(10000000, 10, 20));
expect(view.direction).toEqual(new Cartesian3(-1.0, 0.1, 0.2));
expect(view.up).toEqual(new Cartesian3(0.0, 1.0, 0.1));
});
it("can deserialize lookAt", function () {
var view = CameraView.fromJson({
lookAt: {
targetLongitude: 45,
targetLatitude: -20,
targetHeight: 100,
heading: 10,
pitch: -25,
range: 10000
}
});
expect(view).toEqual(
CameraView.fromLookAt(
Cartographic.fromDegrees(45, -20, 100),
new HeadingPitchRange(
(10 * Math.PI) / 180,
(-25 * Math.PI) / 180,
10000
)
)
);
});
it("can deserialize position/heading/pitch/roll", function () {
var view = CameraView.fromJson({
positionHeadingPitchRoll: {
cameraLongitude: 45,
cameraLatitude: -20,
cameraHeight: 100,
heading: 10,
pitch: -25,
roll: 15
}
});
expect(view).toEqual(
CameraView.fromPositionHeadingPitchRoll(
Cartographic.fromDegrees(45, -20, 100),
(10 * Math.PI) / 180,
(-25 * Math.PI) / 180,
(15 * Math.PI) / 180
)
);
});
});
describe("fromLookAt", function () {
it("throws when targetPosition is not specified", function () {
expect(function () {
return CameraView.fromLookAt(
undefined,
new HeadingPitchRange(
(10 * Math.PI) / 180,
(-25 * Math.PI) / 180,
10000
)
);
}).toThrow();
});
it("throws when headingPitchRange is not specified", function () {
expect(function () {
return CameraView.fromLookAt(
Cartographic.fromDegrees(45, -20, 100),
undefined
);
}).toThrow();
});
it("can look straight down at a point on the equator", function () {
jasmine.addMatchers(CustomMatchers);
var view = CameraView.fromLookAt(
Cartographic.fromDegrees(45, 0, 100),
new HeadingPitchRange(0, CesiumMath.toRadians(90), 10000)
);
var cartographic = Ellipsoid.WGS84.cartesianToCartographic(view.position);
expect(cartographic.longitude).toEqualEpsilon(
CesiumMath.toRadians(45),
1e-5
);
expect(cartographic.latitude).toEqualEpsilon(
CesiumMath.toRadians(0),
1e-5
);
expect(cartographic.height).toEqualEpsilon(10000 + 100, 1);
var surfaceNormal =
Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(cartographic);
expect(
Cartesian3.equalsEpsilon(
view.direction,
Cartesian3.negate(surfaceNormal, new Cartesian3()),
1e-7
)
).toBe(true);
expect(Cartesian3.equalsEpsilon(view.up, Cartesian3.UNIT_Z, 1e-7)).toBe(
true
);
});
it("can look north at a point on the equator", function () {
jasmine.addMatchers(CustomMatchers);
var view = CameraView.fromLookAt(
Cartographic.fromDegrees(45, 0, 100),
new HeadingPitchRange(0, 0, 10000)
);
var cartographic = Ellipsoid.WGS84.cartesianToCartographic(view.position);
expect(cartographic.longitude).toEqualEpsilon(
CesiumMath.toRadians(45),
1e-5
);
expect(cartographic.latitude).toBeLessThan(0);
expect(cartographic.height).toBeGreaterThan(100.0);
var surfaceNormal =
Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(cartographic);
expect(Cartesian3.equalsEpsilon(view.up, surfaceNormal, 1e-2)).toBe(true);
expect(
Cartesian3.equalsEpsilon(view.direction, Cartesian3.UNIT_Z, 1e-7)
).toBe(true);
});
it("can look east at a point on the equator", function () {
jasmine.addMatchers(CustomMatchers);
var view = CameraView.fromLookAt(
Cartographic.fromDegrees(45, 0, 100),
new HeadingPitchRange(CesiumMath.toRadians(90), 0, 10000)
);
var cartographic = Ellipsoid.WGS84.cartesianToCartographic(view.position);
expect(cartographic.longitude).toBeLessThan(CesiumMath.toRadians(45));
expect(cartographic.latitude).toEqualEpsilon(0, 1e-7);
expect(cartographic.height).toBeGreaterThan(100.0);
var targetSurfaceNormal =
Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(
Cartographic.fromDegrees(45, 0)
);
expect(Cartesian3.equalsEpsilon(view.up, targetSurfaceNormal, 1e-7)).toBe(
true
);
expect(
Cartesian3.equalsEpsilon(
Cartesian3.cross(
Cartesian3.UNIT_Z,
targetSurfaceNormal,
new Cartesian3()
),
view.direction,
1e-7
)
).toBe(true);
});
});
describe("fromPositionHeadingPitchRoll", function () {
it("throws when cameraPosition is not specified", function () {
expect(function () {
return CameraView.fromPositionHeadingPitchRoll(undefined, 0, 0, 0);
}).toThrow();
});
it("throws when heading is not specified", function () {
expect(function () {
return CameraView.fromPositionHeadingPitchRoll(
Cartographic.fromDegrees(45, -20, 100),
undefined,
0,
0
);
}).toThrow();
});
it("throws when pitch is not specified", function () {
expect(function () {
return CameraView.fromPositionHeadingPitchRoll(
Cartographic.fromDegrees(45, -20, 100),
0,
undefined,
0
);
}).toThrow();
});
it("throws when roll is not specified", function () {
expect(function () {
return CameraView.fromPositionHeadingPitchRoll(
Cartographic.fromDegrees(45, -20, 100),
0,
0,
undefined
);
}).toThrow();
});
it("can look straight down from a point on the equator", function () {
jasmine.addMatchers(CustomMatchers);
var view = CameraView.fromPositionHeadingPitchRoll(
Cartographic.fromDegrees(45, 0, 100),
0,
CesiumMath.toRadians(-90),
0
);
var cartographic = Ellipsoid.WGS84.cartesianToCartographic(view.position);
expect(cartographic.longitude).toEqualEpsilon(
CesiumMath.toRadians(45),
1e-5
);
expect(cartographic.latitude).toEqualEpsilon(
CesiumMath.toRadians(0),
1e-5
);
expect(cartographic.height).toEqualEpsilon(100, 1);
var surfaceNormal =
Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(cartographic);
expect(
Cartesian3.equalsEpsilon(
view.direction,
Cartesian3.negate(surfaceNormal, new Cartesian3()),
1e-7
)
).toBe(true);
expect(Cartesian3.equalsEpsilon(view.up, Cartesian3.UNIT_Z, 1e-7)).toBe(
true
);
});
it("can look north from a point on the equator", function () {
jasmine.addMatchers(CustomMatchers);
var view = CameraView.fromPositionHeadingPitchRoll(
Cartographic.fromDegrees(45, 0, 100),
0,
0,
0
);
var cartographic = Ellipsoid.WGS84.cartesianToCartographic(view.position);
expect(cartographic.longitude).toEqualEpsilon(
CesiumMath.toRadians(45),
1e-10
);
expect(cartographic.latitude).toEqualEpsilon(0, 1e-10);
expect(cartographic.height).toEqualEpsilon(100.0, 1e-9);
var surfaceNormal =
Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(cartographic);
expect(Cartesian3.equalsEpsilon(view.up, surfaceNormal, 1e-7)).toBe(true);
expect(
Cartesian3.equalsEpsilon(view.direction, Cartesian3.UNIT_Z, 1e-7)
).toBe(true);
});
it("can look east from a point on the equator", function () {
jasmine.addMatchers(CustomMatchers);
var view = CameraView.fromPositionHeadingPitchRoll(
Cartographic.fromDegrees(45, 0, 100),
CesiumMath.toRadians(90),
0,
0
);
var cartographic = Ellipsoid.WGS84.cartesianToCartographic(view.position);
expect(cartographic.longitude).toEqualEpsilon(
CesiumMath.toRadians(45),
1e-10
);
expect(cartographic.latitude).toEqualEpsilon(0, 1e-10);
expect(cartographic.height).toEqualEpsilon(100.0, 1e-9);
var targetSurfaceNormal =
Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(
Cartographic.fromDegrees(45, 0)
);
expect(Cartesian3.equalsEpsilon(view.up, targetSurfaceNormal, 1e-7)).toBe(
true
);
expect(
Cartesian3.equalsEpsilon(
Cartesian3.cross(
Cartesian3.UNIT_Z,
targetSurfaceNormal,
new Cartesian3()
),
view.direction,
1e-7
)
).toBe(true);
});
});
});