cesium 0.22.0 → 0.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/Cesium.js +5 -2
- data/app/assets/javascripts/Core/Cartesian2.js +58 -0
- data/app/assets/javascripts/Core/Cartesian3.js +67 -7
- data/app/assets/javascripts/Core/Cartesian4.js +63 -0
- data/app/assets/javascripts/Core/CatmullRomSpline.js +183 -163
- data/app/assets/javascripts/Core/CorridorGeometry.js +2 -2
- data/app/assets/javascripts/Core/Ellipsoid.js +16 -0
- data/app/assets/javascripts/Core/ExtentGeometry.js +9 -2
- data/app/assets/javascripts/Core/ExtentOutlineGeometry.js +2 -2
- data/app/assets/javascripts/Core/GeometryPipeline.js +23 -23
- data/app/assets/javascripts/Core/HermiteSpline.js +260 -155
- data/app/assets/javascripts/Core/IndexDatatype.js +43 -34
- data/app/assets/javascripts/Core/LinearSpline.js +118 -0
- data/app/assets/javascripts/Core/Math.js +34 -3
- data/app/assets/javascripts/Core/Matrix2.js +26 -0
- data/app/assets/javascripts/Core/Matrix3.js +98 -0
- data/app/assets/javascripts/Core/Matrix4.js +42 -0
- data/app/assets/javascripts/Core/ObjectOrientedBoundingBox.js +396 -0
- data/app/assets/javascripts/Core/PolygonGeometry.js +87 -47
- data/app/assets/javascripts/Core/PolygonGeometryLibrary.js +20 -17
- data/app/assets/javascripts/Core/PolygonOutlineGeometry.js +68 -40
- data/app/assets/javascripts/Core/PolygonPipeline.js +19 -9
- data/app/assets/javascripts/Core/PrimitiveType.js +33 -36
- data/app/assets/javascripts/Core/Quaternion.js +147 -1
- data/app/assets/javascripts/Core/QuaternionSpline.js +160 -0
- data/app/assets/javascripts/Core/Spline.js +121 -0
- data/app/assets/javascripts/Core/Transforms.js +0 -2
- data/app/assets/javascripts/Core/loadArrayBuffer.js +5 -1
- data/app/assets/javascripts/Core/loadBlob.js +5 -1
- data/app/assets/javascripts/Core/loadText.js +4 -1
- data/app/assets/javascripts/Core/loadWithXhr.js +30 -14
- data/app/assets/javascripts/DynamicScene/PolylineOutlineMaterialProperty.js +2 -2
- data/app/assets/javascripts/Renderer/AutomaticUniforms.js +41 -41
- data/app/assets/javascripts/Renderer/Context.js +171 -201
- data/app/assets/javascripts/Renderer/CubeMapFace.js +2 -2
- data/app/assets/javascripts/Renderer/DrawCommand.js +2 -2
- data/app/assets/javascripts/Renderer/PixelFormat.js +22 -28
- data/app/assets/javascripts/Renderer/ShaderProgram.js +65 -46
- data/app/assets/javascripts/Renderer/Texture.js +1 -1
- data/app/assets/javascripts/Renderer/TextureMagnificationFilter.js +7 -9
- data/app/assets/javascripts/Renderer/TextureMinificationFilter.js +19 -25
- data/app/assets/javascripts/Renderer/TextureWrap.js +11 -13
- data/app/assets/javascripts/Renderer/UniformDatatype.js +29 -29
- data/app/assets/javascripts/Renderer/VertexArray.js +43 -35
- data/app/assets/javascripts/Scene/ArcGisMapServerImageryProvider.js +1 -2
- data/app/assets/javascripts/Scene/BillboardCollection.js +10 -1
- data/app/assets/javascripts/Scene/CameraFlightPath.js +58 -101
- data/app/assets/javascripts/Scene/CentralBody.js +1 -4
- data/app/assets/javascripts/Scene/CentralBodySurface.js +1 -2
- data/app/assets/javascripts/Scene/CesiumTerrainProvider.js +1 -2
- data/app/assets/javascripts/Scene/CustomSensorVolume.js +17 -3
- data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +20 -5
- data/app/assets/javascripts/Scene/EllipsoidSurfaceAppearance.js +1 -2
- data/app/assets/javascripts/Scene/FrameState.js +1 -3
- data/app/assets/javascripts/Scene/GoogleEarthImageryProvider.js +2 -5
- data/app/assets/javascripts/Scene/OpenStreetMapImageryProvider.js +1 -2
- data/app/assets/javascripts/Scene/OrthographicFrustum.js +1 -2
- data/app/assets/javascripts/Scene/PerspectiveOffCenterFrustum.js +1 -2
- data/app/assets/javascripts/Scene/Polygon.js +1 -3
- data/app/assets/javascripts/Scene/Polyline.js +5 -2
- data/app/assets/javascripts/Scene/PolylineCollection.js +4 -6
- data/app/assets/javascripts/Scene/Primitive.js +19 -13
- data/app/assets/javascripts/Scene/PrimitivePipeline.js +1 -1
- data/app/assets/javascripts/Scene/Scene.js +7 -10
- data/app/assets/javascripts/Scene/SceneTransforms.js +1 -3
- data/app/assets/javascripts/Scene/SceneTransitioner.js +11 -11
- data/app/assets/javascripts/Scene/SingleTileImageryProvider.js +1 -2
- data/app/assets/javascripts/Scene/TexturePool.js +1 -1
- data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +1 -2
- data/app/assets/javascripts/Scene/VRTheWorldTerrainProvider.js +1 -2
- data/app/assets/javascripts/Scene/ViewportQuad.js +1 -3
- data/app/assets/javascripts/Scene/WebMapServiceImageryProvider.js +1 -2
- data/app/assets/javascripts/ThirdParty/knockout-3.0.0.js +6 -3
- data/app/assets/javascripts/Widgets/CesiumWidget/CesiumWidget.js +4 -3
- data/app/assets/javascripts/Widgets/SceneModePicker/SceneModePickerViewModel.js +1 -1
- data/app/assets/javascripts/Widgets/Viewer/Viewer.js +5 -5
- data/app/assets/javascripts/Widgets/Viewer/viewerDragDropMixin.js +13 -13
- data/app/assets/javascripts/Widgets/Viewer/viewerDynamicObjectMixin.js +6 -6
- data/app/assets/javascripts/Widgets/widgets.css +1 -1
- data/lib/cesium/version.rb +1 -1
- metadata +6 -3
- data/app/assets/javascripts/Core/OrientationInterpolator.js +0 -106
@@ -107,7 +107,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Cartes
|
|
107
107
|
var rightPos, leftPos;
|
108
108
|
var halfLength = endPositionLength / 2;
|
109
109
|
|
110
|
-
var indices = IndexDatatype.createTypedArray(size/3, indicesLength);
|
110
|
+
var indices = IndexDatatype.createTypedArray(size / 3, indicesLength);
|
111
111
|
var index = 0;
|
112
112
|
if (addEndPositions) { // add rounded end
|
113
113
|
leftPos = cartesian3;
|
@@ -568,7 +568,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Cartes
|
|
568
568
|
var i;
|
569
569
|
var iLength = indices.length;
|
570
570
|
var twoLength = length + length;
|
571
|
-
var newIndices = IndexDatatype.createTypedArray(newPositions.length/3, iLength * 2 + twoLength * 3);
|
571
|
+
var newIndices = IndexDatatype.createTypedArray(newPositions.length / 3, iLength * 2 + twoLength * 3);
|
572
572
|
newIndices.set(indices);
|
573
573
|
var index = iLength;
|
574
574
|
for (i = 0; i < iLength; i += 3) { // bottom indices
|
@@ -556,6 +556,22 @@ define(['Core/freezeObject', 'Core/defaultValue', 'Core/defined', 'Core/Develope
|
|
556
556
|
return Cartesian3.multiplyComponents(position, this._oneOverRadii, result);
|
557
557
|
};
|
558
558
|
|
559
|
+
/**
|
560
|
+
* Transforms a Cartesian X, Y, Z position from the ellipsoid-scaled space by multiplying
|
561
|
+
* its components by the result of {@link Ellipsoid#getRadii}.
|
562
|
+
*
|
563
|
+
* @memberof Ellipsoid
|
564
|
+
*
|
565
|
+
* @param {Cartesian3} position The position to transform.
|
566
|
+
* @param {Cartesian3} [result] The position to which to copy the result, or undefined to create and
|
567
|
+
* return a new instance.
|
568
|
+
* @returns {Cartesian3} The position expressed in the unscaled space. The returned instance is the
|
569
|
+
* one passed as the result parameter if it is not undefined, or a new instance of it is.
|
570
|
+
*/
|
571
|
+
Ellipsoid.prototype.transformPositionFromScaledSpace = function(position, result) {
|
572
|
+
return Cartesian3.multiplyComponents(position, this._radii, result);
|
573
|
+
};
|
574
|
+
|
559
575
|
/**
|
560
576
|
* Compares this Ellipsoid against the provided Ellipsoid componentwise and returns
|
561
577
|
* <code>true</code> if they are equal, <code>false</code> otherwise.
|
@@ -613,8 +613,8 @@ define(['Core/defaultValue', 'Core/defined', 'Core/BoundingSphere', 'Core/Cartes
|
|
613
613
|
* @exception {DeveloperError} <code>options.extent.south</code> must be in the interval [<code>-Pi/2</code>, <code>Pi/2</code>].
|
614
614
|
* @exception {DeveloperError} <code>options.extent.east</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].
|
615
615
|
* @exception {DeveloperError} <code>options.extent.west</code> must be in the interval [<code>-Pi</code>, <code>Pi</code>].
|
616
|
-
* @exception {DeveloperError} <code>options.extent.north</code> must be greater than <code>extent.south</code>.
|
617
|
-
* @exception {DeveloperError} <code>options.extent.east</code> must be greater than <code>extent.west</code>.
|
616
|
+
* @exception {DeveloperError} <code>options.extent.north</code> must be greater than <code>options.extent.south</code>.
|
617
|
+
* @exception {DeveloperError} <code>options.extent.east</code> must be greater than <code>options.extent.west</code>.
|
618
618
|
*
|
619
619
|
* @see ExtentGeometry#createGeometry
|
620
620
|
*
|
@@ -653,6 +653,13 @@ define(['Core/defaultValue', 'Core/defined', 'Core/BoundingSphere', 'Core/Cartes
|
|
653
653
|
}
|
654
654
|
|
655
655
|
extent.validate();
|
656
|
+
if (extent.east < extent.west) {
|
657
|
+
throw new DeveloperError('options.extent.east must be greater than options.extent.west');
|
658
|
+
}
|
659
|
+
|
660
|
+
if (extent.north < extent.south) {
|
661
|
+
throw new DeveloperError('options.extent.north must be greater than options.extent.south');
|
662
|
+
}
|
656
663
|
|
657
664
|
this._extent = extent;
|
658
665
|
this._granularity = granularity;
|
@@ -124,7 +124,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/BoundingSphere', 'Core/Cartes
|
|
124
124
|
positions[posIndex++] = position.z;
|
125
125
|
}
|
126
126
|
var indicesSize = positions.length/3 * 2;
|
127
|
-
var indices = IndexDatatype.createTypedArray(positions.length/3, indicesSize);
|
127
|
+
var indices = IndexDatatype.createTypedArray(positions.length / 3, indicesSize);
|
128
128
|
|
129
129
|
var index = 0;
|
130
130
|
for(var i = 0; i < (positions.length/3)-1; i++) {
|
@@ -207,7 +207,7 @@ define(['Core/defaultValue', 'Core/defined', 'Core/BoundingSphere', 'Core/Cartes
|
|
207
207
|
}
|
208
208
|
|
209
209
|
var indicesSize = positions.length/3 * 2 + 8;
|
210
|
-
var indices = IndexDatatype.createTypedArray(positions.length/3, indicesSize);
|
210
|
+
var indices = IndexDatatype.createTypedArray(positions.length / 3, indicesSize);
|
211
211
|
var length = positions.length/6;
|
212
212
|
var index = 0;
|
213
213
|
for (var i = 0; i < length - 1; i++) {
|
@@ -121,14 +121,14 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
121
121
|
|
122
122
|
var indices = geometry.indices;
|
123
123
|
if (defined(indices)) {
|
124
|
-
switch (geometry.primitiveType
|
125
|
-
case PrimitiveType.TRIANGLES
|
124
|
+
switch (geometry.primitiveType) {
|
125
|
+
case PrimitiveType.TRIANGLES:
|
126
126
|
geometry.indices = trianglesToLines(indices);
|
127
127
|
break;
|
128
|
-
case PrimitiveType.TRIANGLE_STRIP
|
128
|
+
case PrimitiveType.TRIANGLE_STRIP:
|
129
129
|
geometry.indices = triangleStripToLines(indices);
|
130
130
|
break;
|
131
|
-
case PrimitiveType.TRIANGLE_FAN
|
131
|
+
case PrimitiveType.TRIANGLE_FAN:
|
132
132
|
geometry.indices = triangleFanToLines(indices);
|
133
133
|
break;
|
134
134
|
default:
|
@@ -396,7 +396,7 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
396
396
|
}
|
397
397
|
|
398
398
|
var indices = geometry.indices;
|
399
|
-
if ((geometry.primitiveType
|
399
|
+
if ((geometry.primitiveType === PrimitiveType.TRIANGLES) && (defined(indices))) {
|
400
400
|
var numIndices = indices.length;
|
401
401
|
var maximumIndex = 0;
|
402
402
|
for ( var j = 0; j < numIndices; j++) {
|
@@ -475,9 +475,9 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
475
475
|
}
|
476
476
|
|
477
477
|
if ((defined(geometry.indices)) &&
|
478
|
-
((geometry.primitiveType
|
479
|
-
(geometry.primitiveType
|
480
|
-
(geometry.primitiveType
|
478
|
+
((geometry.primitiveType !== PrimitiveType.TRIANGLES) &&
|
479
|
+
(geometry.primitiveType !== PrimitiveType.LINES) &&
|
480
|
+
(geometry.primitiveType !== PrimitiveType.POINTS))) {
|
481
481
|
throw new DeveloperError('geometry.primitiveType must equal to PrimitiveType.TRIANGLES, PrimitiveType.LINES, or PrimitiveType.POINTS.');
|
482
482
|
}
|
483
483
|
|
@@ -497,11 +497,11 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
497
497
|
|
498
498
|
var indicesPerPrimitive;
|
499
499
|
|
500
|
-
if (geometry.primitiveType
|
500
|
+
if (geometry.primitiveType === PrimitiveType.TRIANGLES) {
|
501
501
|
indicesPerPrimitive = 3;
|
502
|
-
} else if (geometry.primitiveType
|
502
|
+
} else if (geometry.primitiveType === PrimitiveType.LINES) {
|
503
503
|
indicesPerPrimitive = 2;
|
504
|
-
} else if (geometry.primitiveType
|
504
|
+
} else if (geometry.primitiveType === PrimitiveType.POINTS) {
|
505
505
|
indicesPerPrimitive = 1;
|
506
506
|
}
|
507
507
|
|
@@ -923,7 +923,7 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
923
923
|
throw new DeveloperError('All instance geometries must have an indices or not have one.');
|
924
924
|
}
|
925
925
|
|
926
|
-
if (instances[i].geometry.primitiveType
|
926
|
+
if (instances[i].geometry.primitiveType !== primitiveType) {
|
927
927
|
throw new DeveloperError('All instance geometries must have the same primitiveType.');
|
928
928
|
}
|
929
929
|
}
|
@@ -1063,7 +1063,7 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
1063
1063
|
throw new DeveloperError('geometry.indices length must be greater than 0 and be a multiple of 3.');
|
1064
1064
|
}
|
1065
1065
|
|
1066
|
-
if (geometry.primitiveType
|
1066
|
+
if (geometry.primitiveType !== PrimitiveType.TRIANGLES) {
|
1067
1067
|
throw new DeveloperError('geometry.primitiveType must be PrimitiveType.TRIANGLES.');
|
1068
1068
|
}
|
1069
1069
|
|
@@ -1223,7 +1223,7 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
1223
1223
|
throw new DeveloperError('geometry.indices length must be greater than 0 and be a multiple of 3.');
|
1224
1224
|
}
|
1225
1225
|
|
1226
|
-
if (geometry.primitiveType
|
1226
|
+
if (geometry.primitiveType !== PrimitiveType.TRIANGLES) {
|
1227
1227
|
throw new DeveloperError('geometry.primitiveType must be PrimitiveType.TRIANGLES.');
|
1228
1228
|
}
|
1229
1229
|
|
@@ -1471,18 +1471,18 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
1471
1471
|
}
|
1472
1472
|
|
1473
1473
|
function indexPrimitive(geometry) {
|
1474
|
-
switch (geometry.primitiveType
|
1475
|
-
case PrimitiveType.TRIANGLE_FAN
|
1474
|
+
switch (geometry.primitiveType) {
|
1475
|
+
case PrimitiveType.TRIANGLE_FAN:
|
1476
1476
|
return indexTriangleFan(geometry);
|
1477
|
-
case PrimitiveType.TRIANGLE_STRIP
|
1477
|
+
case PrimitiveType.TRIANGLE_STRIP:
|
1478
1478
|
return indexTriangleStrip(geometry);
|
1479
|
-
case PrimitiveType.TRIANGLES
|
1479
|
+
case PrimitiveType.TRIANGLES:
|
1480
1480
|
return indexTriangles(geometry);
|
1481
|
-
case PrimitiveType.LINE_STRIP
|
1481
|
+
case PrimitiveType.LINE_STRIP:
|
1482
1482
|
return indexLineStrip(geometry);
|
1483
|
-
case PrimitiveType.LINE_LOOP
|
1483
|
+
case PrimitiveType.LINE_LOOP:
|
1484
1484
|
return indexLineLoop(geometry);
|
1485
|
-
case PrimitiveType.LINES
|
1485
|
+
case PrimitiveType.LINES:
|
1486
1486
|
return indexLines(geometry);
|
1487
1487
|
}
|
1488
1488
|
|
@@ -1895,9 +1895,9 @@ define(['Core/barycentricCoordinates', 'Core/defaultValue', 'Core/defined', 'Cor
|
|
1895
1895
|
}
|
1896
1896
|
|
1897
1897
|
indexPrimitive(geometry);
|
1898
|
-
if (geometry.primitiveType
|
1898
|
+
if (geometry.primitiveType === PrimitiveType.TRIANGLES) {
|
1899
1899
|
wrapLongitudeTriangles(geometry);
|
1900
|
-
} else if (geometry.primitiveType
|
1900
|
+
} else if (geometry.primitiveType === PrimitiveType.LINES) {
|
1901
1901
|
wrapLongitudeLines(geometry);
|
1902
1902
|
}
|
1903
1903
|
|
@@ -1,14 +1,159 @@
|
|
1
1
|
/*global define*/
|
2
|
-
define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Cartesian3', 'Core/Matrix4', 'Core/Cartesian4', 'Core/TridiagonalSystemSolver'], function(
|
2
|
+
define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Cartesian3', 'Core/Matrix4', 'Core/Cartesian4', 'Core/Spline', 'Core/TridiagonalSystemSolver'], function(
|
3
3
|
defaultValue,
|
4
4
|
defined,
|
5
5
|
DeveloperError,
|
6
6
|
Cartesian3,
|
7
7
|
Matrix4,
|
8
8
|
Cartesian4,
|
9
|
+
Spline,
|
9
10
|
TridiagonalSystemSolver) {
|
10
11
|
"use strict";
|
11
12
|
|
13
|
+
var scratchLower = [];
|
14
|
+
var scratchDiagonal = [];
|
15
|
+
var scratchUpper = [];
|
16
|
+
var scratchRight = [];
|
17
|
+
|
18
|
+
function generateClamped(points, firstTangent, lastTangent) {
|
19
|
+
var l = scratchLower;
|
20
|
+
var u = scratchUpper;
|
21
|
+
var d = scratchDiagonal;
|
22
|
+
var r = scratchRight;
|
23
|
+
|
24
|
+
l.length = u.length = points.length - 1;
|
25
|
+
d.length = r.length = points.length;
|
26
|
+
|
27
|
+
var i;
|
28
|
+
l[0] = d[0] = 1.0;
|
29
|
+
u[0] = 0.0;
|
30
|
+
|
31
|
+
var right = r[0];
|
32
|
+
if (!defined(right)) {
|
33
|
+
right = r[0] = new Cartesian3();
|
34
|
+
}
|
35
|
+
Cartesian3.clone(firstTangent, right);
|
36
|
+
|
37
|
+
for (i = 1; i < l.length - 1; ++i) {
|
38
|
+
l[i] = u[i] = 1.0;
|
39
|
+
d[i] = 4.0;
|
40
|
+
|
41
|
+
right = r[i];
|
42
|
+
if (!defined(right)) {
|
43
|
+
right = r[i] = new Cartesian3();
|
44
|
+
}
|
45
|
+
Cartesian3.subtract(points[i + 1], points[i - 1], right);
|
46
|
+
Cartesian3.multiplyByScalar(right, 3.0, right);
|
47
|
+
}
|
48
|
+
|
49
|
+
l[i] = 0.0;
|
50
|
+
u[i] = 1.0;
|
51
|
+
d[i] = 4.0;
|
52
|
+
|
53
|
+
right = r[i];
|
54
|
+
if (!defined(right)) {
|
55
|
+
right = r[i] = new Cartesian3();
|
56
|
+
}
|
57
|
+
Cartesian3.subtract(points[i + 1], points[i - 1], right);
|
58
|
+
Cartesian3.multiplyByScalar(right, 3.0, right);
|
59
|
+
|
60
|
+
d[i + 1] = 1.0;
|
61
|
+
right = r[i + 1];
|
62
|
+
if (!defined(right)) {
|
63
|
+
right = r[i + 1] = new Cartesian3();
|
64
|
+
}
|
65
|
+
Cartesian3.clone(lastTangent, right);
|
66
|
+
|
67
|
+
return TridiagonalSystemSolver.solve(l, d, u, r);
|
68
|
+
}
|
69
|
+
|
70
|
+
function generateNatural(points){
|
71
|
+
var l = scratchLower;
|
72
|
+
var u = scratchUpper;
|
73
|
+
var d = scratchDiagonal;
|
74
|
+
var r = scratchRight;
|
75
|
+
|
76
|
+
l.length = u.length = points.length - 1;
|
77
|
+
d.length = r.length = points.length;
|
78
|
+
|
79
|
+
var i;
|
80
|
+
l[0] = u[0] = 1.0;
|
81
|
+
d[0] = 2.0;
|
82
|
+
|
83
|
+
var right = r[0];
|
84
|
+
if (!defined(right)) {
|
85
|
+
right = r[0] = new Cartesian3();
|
86
|
+
}
|
87
|
+
Cartesian3.subtract(points[1], points[0], right);
|
88
|
+
Cartesian3.multiplyByScalar(right, 3.0, right);
|
89
|
+
|
90
|
+
for (i = 1; i < l.length; ++i) {
|
91
|
+
l[i] = u[i] = 1.0;
|
92
|
+
d[i] = 4.0;
|
93
|
+
|
94
|
+
right = r[i];
|
95
|
+
if (!defined(right)) {
|
96
|
+
right = r[i] = new Cartesian3();
|
97
|
+
}
|
98
|
+
Cartesian3.subtract(points[i + 1], points[i - 1], right);
|
99
|
+
Cartesian3.multiplyByScalar(right, 3.0, right);
|
100
|
+
}
|
101
|
+
|
102
|
+
d[i] = 2.0;
|
103
|
+
|
104
|
+
right = r[i];
|
105
|
+
if (!defined(right)) {
|
106
|
+
right = r[i] = new Cartesian3();
|
107
|
+
}
|
108
|
+
Cartesian3.subtract(points[i], points[i - 1], right);
|
109
|
+
Cartesian3.multiplyByScalar(right, 3.0, right);
|
110
|
+
|
111
|
+
return TridiagonalSystemSolver.solve(l, d, u, r);
|
112
|
+
}
|
113
|
+
|
114
|
+
var scratchTimeVec = new Cartesian4();
|
115
|
+
var scratchTemp = new Cartesian3();
|
116
|
+
|
117
|
+
function createEvaluateFunction(spline) {
|
118
|
+
var points = spline.points;
|
119
|
+
var times = spline.times;
|
120
|
+
|
121
|
+
if (points.length < 3) {
|
122
|
+
var t0 = times[0];
|
123
|
+
var invSpan = 1.0 / (times[1] - t0);
|
124
|
+
|
125
|
+
var p0 = points[0];
|
126
|
+
var p1 = points[1];
|
127
|
+
|
128
|
+
return function(time, result) {
|
129
|
+
var u = (time - t0) * invSpan;
|
130
|
+
return Cartesian3.lerp(p0, p1, u, result);
|
131
|
+
};
|
132
|
+
}
|
133
|
+
|
134
|
+
var tangents = spline.tangents;
|
135
|
+
|
136
|
+
return function(time, result) {
|
137
|
+
var i = spline._lastTimeIndex = spline.findTimeInterval(time, spline._lastTimeIndex);
|
138
|
+
var u = (time - times[i]) / (times[i + 1] - times[i]);
|
139
|
+
|
140
|
+
var timeVec = scratchTimeVec;
|
141
|
+
timeVec.z = u;
|
142
|
+
timeVec.y = u * u;
|
143
|
+
timeVec.x = timeVec.y * u;
|
144
|
+
|
145
|
+
var coefs = Matrix4.multiplyByPoint(HermiteSpline.hermiteCoefficientMatrix, timeVec, timeVec);
|
146
|
+
|
147
|
+
result = Cartesian3.multiplyByScalar(points[i], coefs.x, result);
|
148
|
+
Cartesian3.multiplyByScalar(points[i + 1], coefs.y, scratchTemp);
|
149
|
+
Cartesian3.add(result, scratchTemp, result);
|
150
|
+
Cartesian3.multiplyByScalar(tangents[i], coefs.z, scratchTemp);
|
151
|
+
Cartesian3.add(result, scratchTemp, result);
|
152
|
+
Cartesian3.multiplyByScalar(tangents[i + 1], coefs.w, scratchTemp);
|
153
|
+
return Cartesian3.add(result, scratchTemp, result);
|
154
|
+
};
|
155
|
+
}
|
156
|
+
|
12
157
|
/**
|
13
158
|
* A Hermite spline is a cubic interpolating spline. Positions, tangents, and times must be defined
|
14
159
|
* for each control point. If no tangents are specified by the control points, the end and interior
|
@@ -21,210 +166,170 @@ define(['Core/defaultValue', 'Core/defined', 'Core/DeveloperError', 'Core/Cartes
|
|
21
166
|
* @alias HermiteSpline
|
22
167
|
* @constructor
|
23
168
|
*
|
24
|
-
* @param {Array}
|
25
|
-
*
|
169
|
+
* @param {Array} options.times The array of control point times.
|
170
|
+
* @param {Array} options.points The array of control points.
|
171
|
+
* @param {Array} [options.tangents] The array of tangents at each control point.
|
172
|
+
* @param {Cartesian3} [options.firstTangent] The tangent of the curve at the first control point.
|
173
|
+
* If the tangent is not given, it will be estimated.
|
174
|
+
* @param {Cartesian3} [options.lastTangent] The tangent of the curve at the last control point.
|
175
|
+
* If the tangent is not given, it will be estimated.
|
26
176
|
*
|
27
|
-
* @exception {DeveloperError}
|
28
|
-
* @exception {DeveloperError}
|
177
|
+
* @exception {DeveloperError} points is required.
|
178
|
+
* @exception {DeveloperError} points.length must be greater than or equal to 2.
|
179
|
+
* @exception {DeveloperError} times is required.
|
180
|
+
* @exception {DeveloperError} times.length must be equal to points.length.
|
29
181
|
*
|
30
182
|
* @see CatmullRomSpline
|
31
183
|
*
|
32
184
|
* @example
|
33
185
|
* // Example 1.
|
34
186
|
* // Create a natural cubic spline above the earth from Philadelphia to Los Angeles.
|
35
|
-
* var
|
36
|
-
*
|
37
|
-
*
|
38
|
-
*
|
39
|
-
*
|
40
|
-
*
|
41
|
-
*
|
42
|
-
*
|
187
|
+
* var spline = new HermiteSpline({
|
188
|
+
* times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ],
|
189
|
+
* points : [
|
190
|
+
* new Cartesian3(1235398.0, -4810983.0, 4146266.0),
|
191
|
+
* new Cartesian3(1372574.0, -5345182.0, 4606657.0),
|
192
|
+
* new Cartesian3(-757983.0, -5542796.0, 4514323.0),
|
193
|
+
* new Cartesian3(-2821260.0, -5248423.0, 4021290.0),
|
194
|
+
* new Cartesian3(-2539788.0, -4724797.0, 3620093.0)
|
195
|
+
* ]
|
196
|
+
* });
|
43
197
|
*
|
44
198
|
* // Example 2.
|
45
199
|
* // Create a Catmull-Rom spline above the earth from Philadelphia to Los Angeles.
|
46
|
-
* var
|
47
|
-
*
|
48
|
-
*
|
49
|
-
*
|
50
|
-
*
|
51
|
-
*
|
200
|
+
* var times = [ 0.0, 1.5, 3.0, 4.5, 6.0 ];
|
201
|
+
* var points : [
|
202
|
+
* new Cartesian3(1235398.0, -4810983.0, 4146266.0),
|
203
|
+
* new Cartesian3(1372574.0, -5345182.0, 4606657.0),
|
204
|
+
* new Cartesian3(-757983.0, -5542796.0, 4514323.0),
|
205
|
+
* new Cartesian3(-2821260.0, -5248423.0, 4021290.0),
|
206
|
+
* new Cartesian3(-2539788.0, -4724797.0, 3620093.0)
|
52
207
|
* ];
|
53
208
|
*
|
54
209
|
* // Add tangents
|
55
|
-
*
|
56
|
-
*
|
57
|
-
*
|
210
|
+
* var tangents = new Array(points.length);
|
211
|
+
* tangents[0] = new Cartesian3(1125196, -161816, 270551);
|
212
|
+
* for (var i = 1; i < tangents.length - 1; ++i) {
|
213
|
+
* tangents[i] = Cartesian3.multiplyByScalar(Cartesian3.subtract(controlPoints[i + 1].point, controlPoints[i - 1].point), 0.5);
|
58
214
|
* }
|
59
|
-
*
|
215
|
+
* tangents[tangents.length - 1] = new Cartesian3(1165345, 112641, 47281);
|
60
216
|
*
|
61
|
-
* var spline = new HermiteSpline(
|
217
|
+
* var spline = new HermiteSpline({
|
218
|
+
* times : times,
|
219
|
+
* points : points,
|
220
|
+
* tangents : tangents
|
221
|
+
* });
|
62
222
|
*/
|
63
|
-
var HermiteSpline = function(
|
64
|
-
|
65
|
-
throw new DeveloperError('controlPoints is required. It must be an array with at least a length of 3.');
|
66
|
-
}
|
67
|
-
|
68
|
-
this._points = controlPoints;
|
223
|
+
var HermiteSpline = function(options) {
|
224
|
+
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
|
69
225
|
|
70
|
-
|
226
|
+
var points = options.points;
|
227
|
+
var times = options.times;
|
228
|
+
var tangents = options.tangents;
|
229
|
+
var firstTangent = options.firstTangent;
|
230
|
+
var lastTangent = options.lastTangent;
|
71
231
|
|
72
|
-
if (!defined(
|
73
|
-
|
74
|
-
} else if (defined(this._points[0].tangent) && !defined(this._points[1].tangent) && defined(this._points[this._points.length - 1].tangent) && !defined(this._points[this._points.length - 2].tangent)) {
|
75
|
-
generateClamped(this);
|
232
|
+
if (!defined(points)) {
|
233
|
+
throw new DeveloperError('points is required.');
|
76
234
|
}
|
77
|
-
};
|
78
|
-
|
79
|
-
HermiteSpline.hermiteCoefficientMatrix = new Matrix4(
|
80
|
-
2.0, -3.0, 0.0, 1.0,
|
81
|
-
-2.0, 3.0, 0.0, 0.0,
|
82
|
-
1.0, -2.0, 1.0, 0.0,
|
83
|
-
1.0, -1.0, 0.0, 0.0);
|
84
235
|
|
85
|
-
|
86
|
-
|
87
|
-
// for containment of time.
|
88
|
-
var i = defaultValue(hermiteSpline._lastTimeIndex, 0);
|
89
|
-
if (time >= hermiteSpline._points[i].time) {
|
90
|
-
if (i + 1 < hermiteSpline._points.length && time < hermiteSpline._points[i + 1].time) {
|
91
|
-
return i;
|
92
|
-
} else if (i + 2 < hermiteSpline._points.length && time < hermiteSpline._points[i + 2].time) {
|
93
|
-
hermiteSpline._lastTimeIndex = i + 1;
|
94
|
-
return hermiteSpline._lastTimeIndex;
|
95
|
-
}
|
96
|
-
} else if (i - 1 >= 0 && time >= hermiteSpline._points[i - 1].time) {
|
97
|
-
hermiteSpline._lastTimeIndex = i - 1;
|
98
|
-
return hermiteSpline._lastTimeIndex;
|
236
|
+
if (points.length < 2) {
|
237
|
+
throw new DeveloperError('points.length must be greater than or equal to 2.');
|
99
238
|
}
|
100
239
|
|
101
|
-
|
102
|
-
|
103
|
-
// it might be here.
|
104
|
-
for (i = 0; i < hermiteSpline._points.length - 1; ++i) {
|
105
|
-
if (time >= hermiteSpline._points[i].time && time < hermiteSpline._points[i + 1].time) {
|
106
|
-
break;
|
107
|
-
}
|
240
|
+
if (!defined(times)) {
|
241
|
+
throw new DeveloperError('times is required.');
|
108
242
|
}
|
109
243
|
|
110
|
-
if (
|
111
|
-
|
244
|
+
if (times.length !== points.length) {
|
245
|
+
throw new DeveloperError('times.length must be equal to points.length.');
|
112
246
|
}
|
113
247
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
l.length = u.length = hermiteSpline._points.length - 1;
|
121
|
-
d.length = r.length = hermiteSpline._points.length;
|
122
|
-
|
123
|
-
var i;
|
124
|
-
l[0] = d[0] = 1.0;
|
125
|
-
u[0] = 0.0;
|
126
|
-
r[0] = hermiteSpline._points[0].tangent;
|
127
|
-
for (i = 1; i < l.length - 1; ++i) {
|
128
|
-
l[i] = u[i] = 1.0;
|
129
|
-
d[i] = 4.0;
|
130
|
-
r[i] = Cartesian3.multiplyByScalar(Cartesian3.subtract(hermiteSpline._points[i + 1].point, hermiteSpline._points[i - 1].point), 3.0);
|
248
|
+
if (!defined(tangents)) {
|
249
|
+
if (defined(firstTangent) && defined(lastTangent)) {
|
250
|
+
tangents = generateClamped(points, firstTangent, lastTangent);
|
251
|
+
} else {
|
252
|
+
tangents = generateNatural(points);
|
253
|
+
}
|
131
254
|
}
|
132
|
-
l[i] = 0.0;
|
133
|
-
u[i] = 1.0;
|
134
|
-
d[i] = 4.0;
|
135
|
-
r[i] = Cartesian3.multiplyByScalar(Cartesian3.subtract(hermiteSpline._points[i + 1].point, hermiteSpline._points[i - 1].point), 3.0);
|
136
|
-
d[i + 1] = 1.0;
|
137
|
-
r[i + 1] = hermiteSpline._points[i + 1].tangent;
|
138
255
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
256
|
+
/**
|
257
|
+
* An array of times for the control points.
|
258
|
+
* @type {Array}
|
259
|
+
* @readonly
|
260
|
+
*/
|
261
|
+
this.times = times;
|
144
262
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
263
|
+
/**
|
264
|
+
* An array of {@link Cartesian3} control points.
|
265
|
+
* @type {Array}
|
266
|
+
* @readonly
|
267
|
+
*/
|
268
|
+
this.points = points;
|
149
269
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
d[i] = 4.0;
|
157
|
-
r[i] = Cartesian3.multiplyByScalar(Cartesian3.subtract(hermiteSpline._points[i + 1].point, hermiteSpline._points[i - 1].point), 3.0);
|
158
|
-
}
|
159
|
-
d[i] = 2.0;
|
160
|
-
r[i] = Cartesian3.multiplyByScalar(Cartesian3.subtract(hermiteSpline._points[i].point, hermiteSpline._points[i - 1].point), 3.0);
|
270
|
+
/**
|
271
|
+
* An array of {@link Cartesian3} tangents at each control point.
|
272
|
+
* @type {Array}
|
273
|
+
* @readonly
|
274
|
+
*/
|
275
|
+
this.tangents = tangents;
|
161
276
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
277
|
+
this._evaluateFunction = createEvaluateFunction(this);
|
278
|
+
this._lastTimeIndex = 0;
|
279
|
+
};
|
280
|
+
|
281
|
+
HermiteSpline.hermiteCoefficientMatrix = new Matrix4(
|
282
|
+
2.0, -3.0, 0.0, 1.0,
|
283
|
+
-2.0, 3.0, 0.0, 0.0,
|
284
|
+
1.0, -2.0, 1.0, 0.0,
|
285
|
+
1.0, -1.0, 0.0, 0.0);
|
167
286
|
|
168
287
|
/**
|
169
|
-
*
|
170
|
-
*
|
288
|
+
* Finds an index <code>i</code> in <code>times</code> such that the parameter
|
289
|
+
* <code>time</code> is in the interval <code>[times[i], times[i + 1]]</code>.
|
171
290
|
* @memberof HermiteSpline
|
172
|
-
*
|
291
|
+
*
|
292
|
+
* @param {Number} time The time.
|
293
|
+
* @returns {Number} The index for the element at the start of the interval.
|
294
|
+
*
|
295
|
+
* @exception {DeveloperError} time is required.
|
296
|
+
* @exception {DeveloperError} time must be in the range <code>[t<sub>0</sub>, t<sub>n</sub>]</code>, where <code>t<sub>0</sub></code>
|
297
|
+
* is the first element in the array <code>times</code> and <code>t<sub>n</sub></code> is the last element
|
298
|
+
* in the array <code>times</code>.
|
173
299
|
*/
|
174
|
-
HermiteSpline.prototype.
|
175
|
-
return this._points;
|
176
|
-
};
|
300
|
+
HermiteSpline.prototype.findTimeInterval = Spline.prototype.findTimeInterval;
|
177
301
|
|
178
302
|
/**
|
179
303
|
* Evaluates the curve at a given time.
|
180
|
-
*
|
181
304
|
* @memberof HermiteSpline
|
182
305
|
*
|
183
306
|
* @param {Number} time The time at which to evaluate the curve.
|
307
|
+
* @param {Cartesian3} [result] The object onto which to store the result.
|
308
|
+
* @returns {Cartesian3} The modified result parameter or a new instance of the point on the curve at the given time.
|
184
309
|
*
|
185
310
|
* @exception {DeveloperError} time is required.
|
186
|
-
* @exception {DeveloperError} time must be in the range <code>[
|
187
|
-
*
|
188
|
-
*
|
189
|
-
*
|
190
|
-
* @returns {Cartesian3} The point on the curve at the given <code>time</code>.
|
311
|
+
* @exception {DeveloperError} time must be in the range <code>[t<sub>0</sub>, t<sub>n</sub>]</code>, where <code>t<sub>0</sub></code>
|
312
|
+
* is the first element in the array <code>times</code> and <code>t<sub>n</sub></code> is the last element
|
313
|
+
* in the array <code>times</code>.
|
191
314
|
*
|
192
315
|
* @example
|
193
316
|
* // spline above the earth from Philadelphia to Los Angeles
|
194
|
-
* var
|
195
|
-
*
|
196
|
-
*
|
197
|
-
*
|
198
|
-
*
|
199
|
-
*
|
200
|
-
*
|
201
|
-
*
|
317
|
+
* var spline = new HermiteSpline({
|
318
|
+
* times : [ 0.0, 1.5, 3.0, 4.5, 6.0 ],
|
319
|
+
* points : [
|
320
|
+
* new Cartesian3(1235398.0, -4810983.0, 4146266.0),
|
321
|
+
* new Cartesian3(1372574.0, -5345182.0, 4606657.0),
|
322
|
+
* new Cartesian3(-757983.0, -5542796.0, 4514323.0),
|
323
|
+
* new Cartesian3(-2821260.0, -5248423.0, 4021290.0),
|
324
|
+
* new Cartesian3(-2539788.0, -4724797.0, 3620093.0)
|
325
|
+
* ]
|
326
|
+
* });
|
202
327
|
*
|
203
328
|
* // some position above Los Angeles
|
204
329
|
* var position = spline.evaluate(5.0);
|
205
330
|
*/
|
206
|
-
HermiteSpline.prototype.evaluate = function(time) {
|
207
|
-
|
208
|
-
throw new DeveloperError('time is required.');
|
209
|
-
}
|
210
|
-
|
211
|
-
if (time < this._points[0].time || time > this._points[this._points.length - 1].time) {
|
212
|
-
throw new DeveloperError('time is out of range.');
|
213
|
-
}
|
214
|
-
|
215
|
-
var i = findIndex(this, time);
|
216
|
-
var u = (time - this._points[i].time) / (this._points[i + 1].time - this._points[i].time);
|
217
|
-
|
218
|
-
var timeVec = new Cartesian4(0.0, u * u, u);
|
219
|
-
timeVec.x = timeVec.y * u;
|
220
|
-
|
221
|
-
var coefs = Matrix4.multiplyByPoint(HermiteSpline.hermiteCoefficientMatrix, timeVec);
|
222
|
-
var p0 = Cartesian3.multiplyByScalar(this._points[i].point, coefs.x);
|
223
|
-
var p1 = Cartesian3.multiplyByScalar(this._points[i + 1].point, coefs.y);
|
224
|
-
var p2 = Cartesian3.multiplyByScalar(this._points[i].tangent, coefs.z);
|
225
|
-
var p3 = Cartesian3.multiplyByScalar(this._points[i + 1].tangent, coefs.w);
|
226
|
-
|
227
|
-
return Cartesian3.add(Cartesian3.add(Cartesian3.add(p0, p1), p2), p3);
|
331
|
+
HermiteSpline.prototype.evaluate = function(time, result) {
|
332
|
+
return this._evaluateFunction(time, result);
|
228
333
|
};
|
229
334
|
|
230
335
|
return HermiteSpline;
|