📄 qglviewerwidget.cc
字号:
0.0f)); } // rotate else if (_event->state() & LeftButton) { if (last_point_ok_) { if (newPoint_hitSphere = map_to_sphere(newPoint2D, newPoint3D)) { Vec3f axis = last_point_3D_ % newPoint3D; float cos_angle = (last_point_3D_ | newPoint3D); if ( fabs(cos_angle) < 1.0 ) { float angle = 2.0 * acos( cos_angle ) * 180.0 / M_PI; rotate( axis, angle ); } } } } // remember this point last_point_2D_ = newPoint2D; last_point_3D_ = newPoint3D; last_point_ok_ = newPoint_hitSphere; // trigger redraw updateGL();}//----------------------------------------------------------------------------voidQGLViewerWidget::mouseReleaseEvent( QMouseEvent* _event ){ last_point_ok_ = false;}//-----------------------------------------------------------------------------void QGLViewerWidget::wheelEvent(QWheelEvent* _event){ // Use the mouse wheel to zoom in/out float d = -(float)_event->delta() / 120.0 * 0.2 * radius_; translate(Vec3f(0.0, 0.0, d)); updateGL(); _event->accept();}//----------------------------------------------------------------------------void QGLViewerWidget::keyPressEvent( QKeyEvent* _event){ switch( _event->key() ) { case Key_C: if ( glIsEnabled( GL_CULL_FACE ) ) { glDisable( GL_CULL_FACE ); std::cout << "Back face culling: disabled\n"; } else { glEnable( GL_CULL_FACE ); std::cout << "Back face culling: enabled\n"; } updateGL(); break; case Key_I: std::cout << "Radius: " << radius_ << std::endl; std::cout << "Center: " << center_ << std::endl; break; case Key_Space: case Key_M: { double fps = performance(); std::cout << "fps: " #if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000) << std::setiosflags (std::ios::fixed)#else << std::setiosflags (std::ios_base::fixed)#endif << fps << std::endl; } break; case Key_Q: case Key_Escape: qApp->quit(); } _event->ignore();}//----------------------------------------------------------------------------voidQGLViewerWidget::translate( const Vec3f& _trans ){ // Translate the object by _trans // Update modelview_matrix_ makeCurrent(); glLoadIdentity(); glTranslated( _trans[0], _trans[1], _trans[2] ); glMultMatrixd( modelview_matrix_ ); glGetDoublev( GL_MODELVIEW_MATRIX, modelview_matrix_);}//----------------------------------------------------------------------------voidQGLViewerWidget::rotate( const Vec3f& _axis, float _angle ){ // Rotate around center center_, axis _axis, by angle _angle // Update modelview_matrix_ Vec3f t( modelview_matrix_[0]*center_[0] + modelview_matrix_[4]*center_[1] + modelview_matrix_[8]*center_[2] + modelview_matrix_[12], modelview_matrix_[1]*center_[0] + modelview_matrix_[5]*center_[1] + modelview_matrix_[9]*center_[2] + modelview_matrix_[13], modelview_matrix_[2]*center_[0] + modelview_matrix_[6]*center_[1] + modelview_matrix_[10]*center_[2] + modelview_matrix_[14] ); makeCurrent(); glLoadIdentity(); glTranslatef(t[0], t[1], t[2]); glRotated( _angle, _axis[0], _axis[1], _axis[2]); glTranslatef(-t[0], -t[1], -t[2]); glMultMatrixd(modelview_matrix_); glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix_);}//----------------------------------------------------------------------------boolQGLViewerWidget::map_to_sphere( const QPoint& _v2D, Vec3f& _v3D ){ if ( (_v2D.x() >= 0) && (_v2D.x() <= width()) && (_v2D.y() >= 0) && (_v2D.y() <= height()) ) { double x = (double)(_v2D.x() - 0.5*width()) / (double)width(); double y = (double)(0.5*height() - _v2D.y()) / (double)height(); double sinx = sin(M_PI * x * 0.5); double siny = sin(M_PI * y * 0.5); double sinx2siny2 = sinx * sinx + siny * siny; _v3D[0] = sinx; _v3D[1] = siny; _v3D[2] = sinx2siny2 < 1.0 ? sqrt(1.0 - sinx2siny2) : 0.0; return true; } else return false;}//----------------------------------------------------------------------------voidQGLViewerWidget::update_projection_matrix(){ makeCurrent(); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective(45.0, (GLfloat) width() / (GLfloat) height(), 0.01*radius_, 100.0*radius_); glGetDoublev( GL_PROJECTION_MATRIX, projection_matrix_); glMatrixMode( GL_MODELVIEW );}//----------------------------------------------------------------------------voidQGLViewerWidget::view_all(){ translate( Vec3f( -(modelview_matrix_[0]*center_[0] + modelview_matrix_[4]*center_[1] + modelview_matrix_[8]*center_[2] + modelview_matrix_[12]), -(modelview_matrix_[1]*center_[0] + modelview_matrix_[5]*center_[1] + modelview_matrix_[9]*center_[2] + modelview_matrix_[13]), -(modelview_matrix_[2]*center_[0] + modelview_matrix_[6]*center_[1] + modelview_matrix_[10]*center_[2] + modelview_matrix_[14] + 3.0*radius_) ) );}//----------------------------------------------------------------------------voidQGLViewerWidget::set_scene_pos( const Vec3f& _cog, float _radius ){ center_ = _cog; radius_ = _radius; glFogf( GL_FOG_START, _radius ); glFogf( GL_FOG_END, 4.0*_radius ); update_projection_matrix(); view_all();}//----------------------------------------------------------------------------void QGLViewerWidget::add_draw_mode(const std::string& _s){ ++n_draw_modes_; // insert in popup menu popup_menu_->insertItem(_s.c_str(), n_draw_modes_); // store draw mode draw_mode_names_.push_back(_s);}//----------------------------------------------------------------------------voidQGLViewerWidget::slotPopupMenu(int _id){ // un-check all entries for (size_t i=1; i <= n_draw_modes_; ++i) popup_menu_->setItemChecked(i, false); // save draw mode draw_mode_ = _id; // check selected draw mode popup_menu_->setItemChecked(_id, true);}//----------------------------------------------------------------------------double QGLViewerWidget::performance(){ setCursor( waitCursor ); double fps(0.0); makeCurrent(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); OpenMesh::Utils::Timer timer; unsigned int frames = 60; const float angle = 360.0/(float)frames; unsigned int i; Vec3f axis; glFinish(); timer.start(); for (i=0, axis=Vec3f(1,0,0); i<frames; ++i) { rotate(axis, angle); paintGL(); swapBuffers(); } for (i=0, axis=Vec3f(0,1,0); i<frames; ++i) { rotate(axis, angle); paintGL(); swapBuffers(); } for (i=0, axis=Vec3f(0,0,1); i<frames; ++i) { rotate(axis, angle); paintGL(); swapBuffers(); } glFinish(); timer.stop(); glPopMatrix(); updateGL(); fps = ( (3.0 * frames) / timer.seconds() ); setCursor( pointingHandCursor ); return fps;}//=============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -