@@ -435,9 +435,9 @@ void View3D::keyPressEvent(QKeyEvent *event)
435
435
// Centre camera on current cursor location
436
436
m_camera.setCenter (m_cursorPos);
437
437
}
438
- else if (event->key () == Qt::Key_R )
438
+ else if (event->key () == Qt::Key_Z )
439
439
{
440
- // Reset view to from top encompassing selected geometries
440
+ // Reset center and zoom to encompass selected geometries
441
441
QModelIndexList sel = m_selectionModel->selectedRows ();
442
442
if (sel.size () > 0 )
443
443
{
@@ -447,16 +447,54 @@ void View3D::keyPressEvent(QKeyEvent *event)
447
447
m_cursorPos = bbox.center ();
448
448
const double diag = (bbox.max - bbox.min ).length ();
449
449
m_animatedViewTransformEndCamera.setCenter (m_cursorPos);
450
- m_animatedViewTransformEndCamera.setRotation (QQuaternion ());
450
+ m_animatedViewTransformEndCamera.setRotation (m_camera. rotation ());
451
451
m_animatedViewTransformEndCamera.setEyeToCenterDistance (std::max<double >(2 *m_camera.clipNear (), diag*0.7 ));
452
452
beginAnimateViewTransform ();
453
453
}
454
454
}
455
- else if (event->key () == Qt::Key_T )
455
+ else if (event->key () == Qt::Key_A )
456
456
{
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);
460
498
m_animatedViewTransformEndCamera.setEyeToCenterDistance (m_camera.eyeToCenterDistance ());
461
499
beginAnimateViewTransform ();
462
500
}
0 commit comments