CameraView.fromLookAt = function(targetPosition, headingPitchRange) { if (!defined(targetPosition)) { throw new DeveloperError('targetPosition is required.'); } if (!defined(headingPitchRange)) { throw new DeveloperError('headingPitchRange is required.'); } var positionENU = offsetFromHeadingPitchRange(headingPitchRange.heading, -headingPitchRange.pitch, headingPitchRange.range, scratchPosition); var directionENU = Cartesian3.normalize(Cartesian3.negate(positionENU, scratchDirection), scratchDirection); var rightENU = Cartesian3.cross(directionENU, Cartesian3.UNIT_Z, scratchRight); if (Cartesian3.magnitudeSquared(rightENU) < CesiumMath.EPSILON10) { Cartesian3.clone(Cartesian3.UNIT_X, rightENU); } Cartesian3.normalize(rightENU, rightENU); var upENU = Cartesian3.cross(rightENU, directionENU, scratchUp); Cartesian3.normalize(upENU, upENU); var targetCartesian = Ellipsoid.WGS84.cartographicToCartesian(targetPosition, scratchTarget); var transform = Transforms.eastNorthUpToFixedFrame(targetCartesian, Ellipsoid.WGS84, scratchMatrix4); var offsetECF = Matrix4.multiplyByPointAsVector(transform, positionENU, scratchOffset); var position = Cartesian3.add(targetCartesian, offsetECF, new Cartesian3()); var direction = Cartesian3.normalize(Cartesian3.negate(offsetECF, new Cartesian3()), new Cartesian3()); var up = Matrix4.multiplyByPointAsVector(transform, upENU, new Cartesian3()); // Estimate a rectangle for this view. var fieldOfViewHalfAngle = CesiumMath.toRadians(30); var groundDistance = Math.tan(fieldOfViewHalfAngle) * (headingPitchRange.range + targetPosition.height); var angle = groundDistance / Ellipsoid.WGS84.minimumRadius; var extent = new Rectangle(targetPosition.longitude - angle, targetPosition.latitude - angle, targetPosition.longitude + angle, targetPosition.latitude + angle); return new CameraView(extent, position, direction, up); };
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); });