Skip to content

Commit b273aed

Browse files
committed
Zoom reset now Z and align to axis now A, no R and T
1 parent f9cd1b1 commit b273aed

File tree

1 file changed

+45
-7
lines changed

1 file changed

+45
-7
lines changed

src/view3d.cpp

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -435,9 +435,9 @@ void View3D::keyPressEvent(QKeyEvent *event)
435435
// Centre camera on current cursor location
436436
m_camera.setCenter(m_cursorPos);
437437
}
438-
else if(event->key() == Qt::Key_R)
438+
else if(event->key() == Qt::Key_Z)
439439
{
440-
// Reset view to from top encompassing selected geometries
440+
// Reset center and zoom to encompass selected geometries
441441
QModelIndexList sel = m_selectionModel->selectedRows();
442442
if(sel.size() > 0)
443443
{
@@ -447,16 +447,54 @@ void View3D::keyPressEvent(QKeyEvent *event)
447447
m_cursorPos = bbox.center();
448448
const double diag = (bbox.max - bbox.min).length();
449449
m_animatedViewTransformEndCamera.setCenter(m_cursorPos);
450-
m_animatedViewTransformEndCamera.setRotation(QQuaternion());
450+
m_animatedViewTransformEndCamera.setRotation(m_camera.rotation());
451451
m_animatedViewTransformEndCamera.setEyeToCenterDistance(std::max<double>(2*m_camera.clipNear(), diag*0.7));
452452
beginAnimateViewTransform();
453453
}
454454
}
455-
else if(event->key() == Qt::Key_T)
455+
else if(event->key() == Qt::Key_A)
456456
{
457-
// Reset view to from top
458-
m_animatedViewTransformEndCamera.setCenter(m_camera.center());
459-
m_animatedViewTransformEndCamera.setRotation(QQuaternion());
457+
// Snap to nearest axis position
458+
QQuaternion rot = m_camera.rotation();
459+
460+
QMatrix4x4 m;
461+
QVector3D e;
462+
QVector3D newE;
463+
double a;
464+
QQuaternion rotStep;
465+
466+
// snap view pos to nearest axis
467+
m.setToIdentity();
468+
m.rotate(rot);
469+
e = QVector3D(0, 0, 1) * m;
470+
if(fabs(e.x()) > std::max(fabs(e.y()), fabs(e.z())))
471+
newE = QVector3D(Imath::sign(e.x()), 0, 0);
472+
else if(fabs(e.y()) > fabs(e.z()))
473+
newE = QVector3D(0, Imath::sign(e.y()), 0);
474+
else
475+
newE = QVector3D(0, 0, Imath::sign(e.z()));
476+
e = QVector3D::crossProduct(newE, e);
477+
a = asin(e.length());
478+
e.normalize();
479+
rot *= QQuaternion::fromAxisAndAngle(e, a*180/M_PI); // function wants angle in deg!
480+
481+
// snap view up to nearest axis
482+
m.setToIdentity();
483+
m.rotate(rot);
484+
e = QVector3D(0, 1, 0) * m;
485+
if(fabs(e.x()) > std::max(fabs(e.y()), fabs(e.z())))
486+
newE = QVector3D(Imath::sign(e.x()), 0, 0);
487+
else if(fabs(e.y()) > fabs(e.z()))
488+
newE = QVector3D(0, Imath::sign(e.y()), 0);
489+
else
490+
newE = QVector3D(0, 0, Imath::sign(e.z()));
491+
e = QVector3D::crossProduct(newE, e);
492+
a = asin(e.length());
493+
e.normalize();
494+
rot *= QQuaternion::fromAxisAndAngle(e, a*180/M_PI); // function wants angle in deg!
495+
496+
m_animatedViewTransformEndCamera.setCenter(m_cursorPos);
497+
m_animatedViewTransformEndCamera.setRotation(rot);
460498
m_animatedViewTransformEndCamera.setEyeToCenterDistance(m_camera.eyeToCenterDistance());
461499
beginAnimateViewTransform();
462500
}

0 commit comments

Comments
 (0)