コード例 #1
0
ファイル: CameraView.js プロジェクト: JJediny/terriajs
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);
};
コード例 #2
0
ファイル: CameraViewSpec.js プロジェクト: JJediny/terriajs
        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);
        });