Skip to content

Commit

Permalink
Merge pull request #1858 from AnalyticalGraphicsInc/constrainedAxis
Browse files Browse the repository at this point in the history
Camera Constrained Axis
  • Loading branch information
pjcozzi committed Jun 25, 2014
2 parents 82b0bc2 + c47fb79 commit 2c234ad
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 46 deletions.
4 changes: 2 additions & 2 deletions Source/Scene/Camera.js
Expand Up @@ -1189,13 +1189,13 @@ define([
var dot = Cartesian3.dot(p, constrainedAxis);
var angleToAxis = CesiumMath.acosClamped(dot);
if (angle > 0 && angle > angleToAxis) {
angle = angleToAxis;
angle = angleToAxis - CesiumMath.EPSILON4;
}

dot = Cartesian3.dot(p, Cartesian3.negate(constrainedAxis, rotateVertScratchNegate));
angleToAxis = CesiumMath.acosClamped(dot);
if (angle < 0 && -angle > angleToAxis) {
angle = -angleToAxis;
angle = -angleToAxis + CesiumMath.EPSILON4;
}

var tangent = Cartesian3.cross(constrainedAxis, p, rotateVertScratchTan);
Expand Down
35 changes: 0 additions & 35 deletions Source/Scene/ScreenSpaceCameraController.js
Expand Up @@ -702,41 +702,6 @@ define([
var deltaPhi = rotateRate * phiWindowRatio * Math.PI * 2.0;
var deltaTheta = rotateRate * thetaWindowRatio * Math.PI;

if (defined(camera.constrainedAxis) && !defined(transform)) {
var positionNormal = Cartesian3.normalize(camera.position, rotate3DScratchCartesian3);
var northParallel = Cartesian3.equalsEpsilon(positionNormal, camera.constrainedAxis, CesiumMath.EPSILON2);
var southParallel = Cartesian3.equalsEpsilon(positionNormal, Cartesian3.negate(camera.constrainedAxis, rotate3DNegateScratch), CesiumMath.EPSILON2);

if (!northParallel && !southParallel) {
var up;
if (Cartesian3.dot(camera.position, camera.direction) + 1 < CesiumMath.EPSILON4) {
up = camera.up;
} else {
up = camera.direction;
}

var east;
if (Cartesian3.equalsEpsilon(camera.constrainedAxis, positionNormal, CesiumMath.EPSILON2)) {
east = camera.right;
} else {
east = Cartesian3.cross(camera.constrainedAxis, positionNormal, rotate3DScratchCartesian3);
Cartesian3.normalize(east, east);
}

var rDotE = Cartesian3.dot(camera.right, east);
var signRDotE = (CesiumMath.sign(rDotE) < 0.0) ? -1.0 : 1.0;
rDotE = Math.abs(rDotE);
var uDotA = Cartesian3.dot(up, camera.constrainedAxis);
var uDotE = Cartesian3.dot(up, east);
var signInnerSum = ((uDotA > 0.0 && uDotE > 0.0) || (uDotA < 0.0 && uDotE < 0.0)) ? -1.0 : 1.0;
uDotA = Math.abs(uDotA);

var originalDeltaTheta = deltaTheta;
deltaTheta = signRDotE * (deltaTheta * uDotA - signInnerSum * deltaPhi * (1.0 - rDotE));
deltaPhi = signRDotE * (deltaPhi * rDotE + signInnerSum * originalDeltaTheta * (1.0 - uDotA));
}
}

camera.rotateRight(deltaPhi, transform);
camera.rotateUp(deltaTheta, transform);

Expand Down
8 changes: 4 additions & 4 deletions Specs/Scene/CameraSpec.js
Expand Up @@ -631,10 +631,10 @@ defineSuite([
it('rotate past constrained axis stops at constained axis', function() {
camera.constrainedAxis = Cartesian3.UNIT_Y;
camera.rotateUp(Math.PI);
expect(camera.up).toEqualEpsilon(Cartesian3.negate(dir, new Cartesian3()), CesiumMath.EPSILON15);
expect(camera.direction).toEqualEpsilon(up, CesiumMath.EPSILON15);
expect(camera.right).toEqualEpsilon(right, CesiumMath.EPSILON15);
expect(camera.position).toEqualEpsilon(Cartesian3.negate(Cartesian3.UNIT_Y, new Cartesian3()), CesiumMath.EPSILON15);
expect(camera.up).toEqualEpsilon(Cartesian3.negate(dir, new Cartesian3()), CesiumMath.EPSILON4);
expect(camera.direction).toEqualEpsilon(up, CesiumMath.EPSILON4);
expect(camera.right).toEqualEpsilon(right, CesiumMath.EPSILON4);
expect(camera.position).toEqualEpsilon(Cartesian3.negate(Cartesian3.UNIT_Y, new Cartesian3()), CesiumMath.EPSILON4);
});

it('zooms out 2D', function() {
Expand Down
10 changes: 5 additions & 5 deletions Specs/Scene/ScreenSpaceCameraControllerSpec.js
Expand Up @@ -867,10 +867,10 @@ defineSuite([
MockCanvas.moveMouse(canvas, MouseButtons.LEFT, startPosition, endPosition);
updateController(frameState);

expect(camera.position).toEqualEpsilon(Cartesian3.multiplyByScalar(axis, Cartesian3.magnitude(camera.position), new Cartesian3()), CesiumMath.EPSILON8);
expect(camera.direction).toEqualEpsilon(Cartesian3.negate(axis, new Cartesian3()), CesiumMath.EPSILON14);
expect(camera.position.z).toEqualEpsilon(Cartesian3.magnitude(camera.position), CesiumMath.EPSILON1);
expect(camera.direction).toEqualEpsilon(Cartesian3.negate(axis, new Cartesian3()), CesiumMath.EPSILON4);
expect(Cartesian3.dot(camera.up, axis)).toBeLessThan(CesiumMath.EPSILON2);
expect(camera.right).toEqualEpsilon(Cartesian3.cross(camera.direction, camera.up, new Cartesian3()), CesiumMath.EPSILON14);
expect(camera.right).toEqualEpsilon(Cartesian3.cross(camera.direction, camera.up, new Cartesian3()), CesiumMath.EPSILON4);
});

it('pans with constrained axis and is tilted', function() {
Expand Down Expand Up @@ -911,9 +911,9 @@ defineSuite([
MockCanvas.moveMouse(canvas, MouseButtons.LEFT, startPosition, endPosition);
updateController(frameState);

expect(Cartesian3.dot(camera.position, axis)).toBeLessThan(CesiumMath.EPSILON2);
expect(Cartesian3.dot(Cartesian3.normalize(camera.position, new Cartesian3()), axis)).toEqualEpsilon(1.0, CesiumMath.EPSILON2);
expect(camera.direction).toEqualEpsilon(Cartesian3.negate(Cartesian3.normalize(camera.position, new Cartesian3()), new Cartesian3()), CesiumMath.EPSILON15);
expect(camera.right).toEqualEpsilon(axis, CesiumMath.EPSILON15);
expect(camera.right).toEqualEpsilon(Cartesian3.negate(Cartesian3.UNIT_Y, new Cartesian3()), CesiumMath.EPSILON4);
expect(camera.up).toEqualEpsilon(Cartesian3.cross(camera.right, camera.direction, new Cartesian3()), CesiumMath.EPSILON15);
});

Expand Down

0 comments on commit 2c234ad

Please sign in to comment.