Skip to content

Commit

Permalink
Improve CameraControl dollying through objects #469
Browse files Browse the repository at this point in the history
  • Loading branch information
xeolabs committed Nov 13, 2020
1 parent 9d7e090 commit cc8c565
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 13 deletions.
8 changes: 4 additions & 4 deletions src/viewer/scene/CameraControl/CameraControl.js
Expand Up @@ -656,7 +656,7 @@ class CameraControl extends Component {
touchDollyRate: 0.05,
dollyInertia: 0,
dollyProximityThreshold: 30.0,
dollyMinSpeed: 0.06
dollyMinSpeed: 0.04
};

// Current runtime state of the CameraControl
Expand Down Expand Up @@ -1478,18 +1478,18 @@ class CameraControl extends Component {
/**
* Sets the minimum dolly speed.
*
* Default is ````0.06````.
* Default is ````0.04````.
*
* @param {Number} dollyMinSpeed New dolly minimum speed.
*/
set dollyMinSpeed(dollyMinSpeed) {
this._configs.dollyMinSpeed = (dollyMinSpeed !== undefined && dollyMinSpeed !== null) ? dollyMinSpeed : 0.06;
this._configs.dollyMinSpeed = (dollyMinSpeed !== undefined && dollyMinSpeed !== null) ? dollyMinSpeed : 0.04;
}

/**
* Gets the minimum dolly speed.
*
* Default is ````0.06````.
* Default is ````0.04````.
*
* @returns {Number} The current minimum dolly speed.
*/
Expand Down
15 changes: 12 additions & 3 deletions src/viewer/scene/CameraControl/lib/CameraUpdater.js
Expand Up @@ -245,7 +245,10 @@ class CameraUpdater {
}

if (configs.followPointer) {
panController.dolly(pivotController.getPivotPos(), states.pointerCanvasPos, -dollyDeltaForDist);
const dolliedThroughSurface = panController.dolly(pivotController.getPivotPos(), states.pointerCanvasPos, -dollyDeltaForDist);
if (dolliedThroughSurface) {
states.followPointerDirty = true;
}
} else {
camera.pan([0, 0, dollyDeltaForDist]);
camera.ortho.scale = camera.ortho.scale - dollyDeltaForDist;
Expand All @@ -271,15 +274,21 @@ class CameraUpdater {
} else if (configs.planView) {

if (configs.followPointer) {
panController.dolly(pivotController.getPivotPos(), states.pointerCanvasPos, -dollyDeltaForDist);
const dolliedThroughSurface = panController.dolly(pivotController.getPivotPos(), states.pointerCanvasPos, -dollyDeltaForDist);
if (dolliedThroughSurface) {
states.followPointerDirty = true;
}
} else {
camera.zoom(dollyDeltaForDist);
}

} else { // Orbiting

if (configs.followPointer) {
panController.dolly(pivotController.getPivotPos(), states.pointerCanvasPos, -dollyDeltaForDist);
let dolliedThroughSurface = panController.dolly(pivotController.getPivotPos(), states.pointerCanvasPos, -dollyDeltaForDist);
if (dolliedThroughSurface) {
states.followPointerDirty = true;
}
} else {
camera.zoom(dollyDeltaForDist);
}
Expand Down
15 changes: 11 additions & 4 deletions src/viewer/scene/CameraControl/lib/controllers/PanController.js
Expand Up @@ -61,11 +61,13 @@ class PanController {

const camera = this._scene.camera;

let dolliedThroughSurface = false;

if (camera.projection === "perspective") {

camera.ortho.scale = camera.ortho.scale - dollyDelta;

this._dollyToWorldPos(worldPos, dollyDelta);
dolliedThroughSurface = this._dollyToWorldPos(worldPos, dollyDelta);

} else if (camera.projection === "ortho") {

Expand All @@ -86,6 +88,8 @@ class PanController {
camera.eye = [camera.eye[0] - moveVec[0], camera.eye[1] - moveVec[1], camera.eye[2] - moveVec[2]];
camera.look = [camera.look[0] - moveVec[0], camera.look[1] - moveVec[1], camera.look[2] - moveVec[2]];
}

return dolliedThroughSurface;
}

_getInverseProjectMat() {
Expand Down Expand Up @@ -192,11 +196,12 @@ class PanController {

const camera = this._scene.camera;
const eyeToWorldPosVec = math.subVec3(worldPos, camera.eye, tempVec3a);
const eyeWorldPosDist = math.lenVec3(eyeToWorldPosVec);

const dist = math.lenVec3(eyeToWorldPosVec);
let dolliedThroughSurface = false;

if (dist < dollyDelta) {
return;
if (eyeWorldPosDist < dollyDelta) {
dolliedThroughSurface = true;
}

math.normalizeVec3(eyeToWorldPosVec);
Expand All @@ -210,6 +215,8 @@ class PanController {

camera.eye = [eye[0] + px, eye[1] + py, eye[2] + pz];
camera.look = [look[0] + px, look[1] + py, look[2] + pz];

return dolliedThroughSurface;
}

destroy() {
Expand Down
Expand Up @@ -145,8 +145,9 @@ class MousePickHandler {
pickController.update();

if (e.which === 1) {// Left button
if (pickController.pickResult) {
pivotController.setPivotPos(pickController.pickResult.worldPos);
const pickResult = pickController.pickResult;
if (pickResult && pickResult.worldPos) {
pivotController.setPivotPos(pickResult.worldPos);
pivotController.startPivot();
} else {
pivotController.setPivotPos(scene.camera.look);
Expand Down

0 comments on commit cc8c565

Please sign in to comment.