⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qglviewerwidget.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
📖 第 1 页 / 共 2 页
字号:
		     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 + -