[QGLViewer]3D场景鼠标点击位置

重载鼠标事件:

void AxMapControl::mousePressEvent(QMouseEvent* e)
{
	switch(currentTool)
	{
		case AX_DRAW_DIRECTION:
			{
				if (e->button() == Qt::LeftButton) 
				{
					QPoint screenPt=e->pos();
					qglviewer::Vec orig1, dir1;
					camera()->convertClickToLine(screenPt, orig1, dir1);
					double valueZ=0;
					double a = ( valueZ- orig1.z) / dir1.z;
					Pnt.z = valueZ;
					Pnt.x = orig1.x + dir1.x * a;
					Pnt.y = orig1.y + dir1.y * a;
					//QMessageBox::information(this, "PickPoint",	QString::number(Pnt.x) + "," + QString::number(Pnt.y));
				}
				break;
			}
			
	}
	QGLViewer::mousePressEvent(e);
}

 重载绘制方法

void AxMapControl::draw()
{
		if (pimpl->points.size()>0)
		{
			QMutexLocker locker(&pimpl->mutex_);
			glColor3f(255/255.0, 69/255.0, 0.0);
			draw_3d_points(pimpl->points);
		}
		if (pimpl->pointCloudOneFrame.size()>0)
		{
			QMutexLocker locker(&pimpl->mutex_);
			glColor3f(255/255.0, 69/255.0, 0.0);
			for (vector<Point3ds>::const_iterator it = pimpl->pointCloudOneFrame.begin();it != pimpl->pointCloudOneFrame.end(); ++it) 
			{
				const Point3ds& p = *it;
				if (p.size()>0)
				{
					draw_3d_points(p);
				}
				
			}
		}
		if (!glImg.isNull())
		{
			glNormal3f(0.0, 0.0, 1.0);
			glBegin(GL_QUADS);
			glTexCoord2f(0.0,   1.0-v_max);	
			glVertex2f(-u_max*ratio,-v_max);
			glTexCoord2f(0.0,   1.0);		
			glVertex2f(-u_max*ratio, v_max);
			glTexCoord2f(u_max, 1.0);		
			glVertex2f( u_max*ratio, v_max);
			glTexCoord2f(u_max, 1.0-v_max);	
			glVertex2f( u_max*ratio,-v_max);
			glEnd();
		}

		if (currentTool==AX_DRAW_DIRECTION)
		{
			glBegin(GL_LINES);
			glColor3f(255/255.0, 0/255.0, 0.0);
			glVertex3fv(currentPose);
			glVertex3fv(Pnt);
			glEnd();
		}

 效果:

posted @ 2017-05-10 10:55  太一吾鱼水  阅读(561)  评论(0编辑  收藏  举报