Adjust orbit center after panning #194
This commit is contained in:
parent
c8f3511708
commit
9e4aa58de2
@ -34,10 +34,14 @@ OV.BoundingBoxCalculator3D = class
|
||||
new OV.Coord3D (Infinity, Infinity, Infinity),
|
||||
new OV.Coord3D (-Infinity, -Infinity, -Infinity)
|
||||
);
|
||||
this.isValid = false;
|
||||
}
|
||||
|
||||
GetBox ()
|
||||
{
|
||||
if (!this.isValid) {
|
||||
return null;
|
||||
}
|
||||
return this.box;
|
||||
}
|
||||
|
||||
@ -49,5 +53,6 @@ OV.BoundingBoxCalculator3D = class
|
||||
this.box.max.x = Math.max (this.box.max.x, point.x);
|
||||
this.box.max.y = Math.max (this.box.max.y, point.y);
|
||||
this.box.max.z = Math.max (this.box.max.z, point.z);
|
||||
this.isValid = true;
|
||||
}
|
||||
};
|
||||
|
||||
@ -262,18 +262,19 @@ OV.NavigationType =
|
||||
|
||||
OV.Navigation = class
|
||||
{
|
||||
constructor (canvas, camera)
|
||||
constructor (canvas, camera, callbacks)
|
||||
{
|
||||
this.canvas = canvas;
|
||||
this.camera = camera;
|
||||
this.callbacks = callbacks;
|
||||
this.orbitCenter = this.camera.center.Clone ();
|
||||
this.fixUpVector = true;
|
||||
|
||||
this.mouse = new OV.MouseInteraction ();
|
||||
this.touch = new OV.TouchInteraction ();
|
||||
this.clickDetector = new OV.ClickDetector ();
|
||||
this.lastNavigationType = OV.NavigationType.None;
|
||||
|
||||
this.onUpdate = null;
|
||||
this.onMouseClick = null;
|
||||
this.onMouseMove = null;
|
||||
this.onContext = null;
|
||||
@ -294,11 +295,6 @@ OV.Navigation = class
|
||||
}
|
||||
}
|
||||
|
||||
SetUpdateHandler (onUpdate)
|
||||
{
|
||||
this.onUpdate = onUpdate;
|
||||
}
|
||||
|
||||
SetMouseClickHandler (onMouseClick)
|
||||
{
|
||||
this.onMouseClick = onMouseClick;
|
||||
@ -464,6 +460,7 @@ OV.Navigation = class
|
||||
this.Zoom (-moveDiff.y * zoomRatio);
|
||||
}
|
||||
|
||||
this.lastNavigationType = navigationType;
|
||||
this.Update ();
|
||||
}
|
||||
|
||||
@ -476,6 +473,11 @@ OV.Navigation = class
|
||||
let mouseCoords = this.mouse.GetPosition ();
|
||||
this.Click (ev.which, mouseCoords);
|
||||
}
|
||||
|
||||
if (this.lastNavigationType === OV.NavigationType.Pan) {
|
||||
this.UpdateOrbitCenter ();
|
||||
}
|
||||
this.lastNavigationType = OV.NavigationType.None;
|
||||
}
|
||||
|
||||
OnMouseLeave (ev)
|
||||
@ -505,16 +507,25 @@ OV.Navigation = class
|
||||
let moveDiff = this.touch.GetMoveDiff ();
|
||||
let distanceDiff = this.touch.GetDistanceDiff ();
|
||||
let fingerCount = this.touch.GetFingerCount ();
|
||||
|
||||
let navigationType = OV.NavigationType.None;
|
||||
if (fingerCount === 1) {
|
||||
navigationType = OV.NavigationType.Orbit;
|
||||
} else if (fingerCount === 2) {
|
||||
navigationType = OV.NavigationType.Pan;
|
||||
}
|
||||
|
||||
if (navigationType === OV.NavigationType.Orbit) {
|
||||
let orbitRatio = 0.5;
|
||||
this.Orbit (moveDiff.x * orbitRatio, moveDiff.y * orbitRatio);
|
||||
} else if (fingerCount === 2) {
|
||||
} else if (navigationType === OV.NavigationType.Pan) {
|
||||
let zoomRatio = 0.005;
|
||||
this.Zoom (distanceDiff * zoomRatio);
|
||||
let panRatio = 0.001 * OV.CoordDistance3D (this.camera.eye, this.camera.center);
|
||||
this.Pan (moveDiff.x * panRatio, moveDiff.y * panRatio);
|
||||
}
|
||||
|
||||
this.lastNavigationType = navigationType;
|
||||
this.Update ();
|
||||
}
|
||||
|
||||
@ -531,6 +542,11 @@ OV.Navigation = class
|
||||
this.Click (1, touchCoords);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.lastNavigationType === OV.NavigationType.Pan) {
|
||||
this.UpdateOrbitCenter ();
|
||||
}
|
||||
this.lastNavigationType = OV.NavigationType.None;
|
||||
}
|
||||
|
||||
OnMouseWheel (ev)
|
||||
@ -616,9 +632,7 @@ OV.Navigation = class
|
||||
|
||||
Update ()
|
||||
{
|
||||
if (this.onUpdate) {
|
||||
this.onUpdate ();
|
||||
}
|
||||
this.callbacks.onUpdate ();
|
||||
}
|
||||
|
||||
Click (button, mouseCoords)
|
||||
@ -639,4 +653,12 @@ OV.Navigation = class
|
||||
this.onContext (globalCoords, localCoords);
|
||||
}
|
||||
}
|
||||
|
||||
UpdateOrbitCenter ()
|
||||
{
|
||||
let centerCoord = this.callbacks.getCenterIntersection ();
|
||||
if (centerCoord !== null) {
|
||||
this.orbitCenter = centerCoord;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -488,7 +488,7 @@ OV.Viewer = class
|
||||
this.extraGeometry = new OV.ViewerExtraGeometry (this.scene);
|
||||
this.axis = new OV.ViewerAxis (this.scene);
|
||||
|
||||
this.InitCamera ();
|
||||
this.InitNavigation ();
|
||||
this.InitShading ();
|
||||
|
||||
this.Render ();
|
||||
@ -742,13 +742,8 @@ OV.Viewer = class
|
||||
|
||||
GetMeshIntersectionUnderMouse (mouseCoords)
|
||||
{
|
||||
let width = this.canvas.width;
|
||||
let height = this.canvas.height;
|
||||
if (window.devicePixelRatio) {
|
||||
width /= window.devicePixelRatio;
|
||||
height /= window.devicePixelRatio;
|
||||
}
|
||||
let intersection = this.geometry.GetMeshIntersectionUnderMouse (mouseCoords, this.camera, width, height);
|
||||
let canvasSize = this.GetCanvasSize ();
|
||||
let intersection = this.geometry.GetMeshIntersectionUnderMouse (mouseCoords, this.camera, canvasSize.width, canvasSize.height);
|
||||
if (intersection === null) {
|
||||
return null;
|
||||
}
|
||||
@ -791,7 +786,7 @@ OV.Viewer = class
|
||||
});
|
||||
}
|
||||
|
||||
InitCamera ()
|
||||
InitNavigation ()
|
||||
{
|
||||
this.camera = new THREE.PerspectiveCamera (45.0, this.canvas.width / this.canvas.height, 0.1, 1000.0);
|
||||
this.scene.add (this.camera);
|
||||
@ -799,9 +794,19 @@ OV.Viewer = class
|
||||
let canvasElem = this.renderer.domElement;
|
||||
let camera = OV.GetDefaultCamera (OV.Direction.Z);
|
||||
|
||||
this.navigation = new OV.Navigation (canvasElem, camera);
|
||||
this.navigation.SetUpdateHandler (() => {
|
||||
this.Render ();
|
||||
this.navigation = new OV.Navigation (canvasElem, camera, {
|
||||
onUpdate : () => {
|
||||
this.Render ();
|
||||
},
|
||||
getCenterIntersection : () => {
|
||||
let canvasSize = this.GetCanvasSize ();
|
||||
let centerCoord = new OV.Coord2D (canvasSize.width / 2.0, canvasSize.height / 2.0);
|
||||
let intersection = this.GetMeshIntersectionUnderMouse (centerCoord);
|
||||
if (intersection === null) {
|
||||
return null;
|
||||
}
|
||||
return new OV.Coord3D (intersection.point.x, intersection.point.y, intersection.point.z);
|
||||
}
|
||||
});
|
||||
|
||||
this.upVector = new OV.UpVector ();
|
||||
@ -822,6 +827,20 @@ OV.Viewer = class
|
||||
};
|
||||
}
|
||||
|
||||
GetCanvasSize ()
|
||||
{
|
||||
let width = this.canvas.width;
|
||||
let height = this.canvas.height;
|
||||
if (window.devicePixelRatio) {
|
||||
width /= window.devicePixelRatio;
|
||||
height /= window.devicePixelRatio;
|
||||
}
|
||||
return {
|
||||
width : width,
|
||||
height : height
|
||||
};
|
||||
}
|
||||
|
||||
GetImageAsDataUrl (width, height)
|
||||
{
|
||||
let originalSize = this.GetImageSize ();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user