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

2022-10-29,,

重载鼠标事件:

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();
}

效果:

[QGLViewer]3D场景鼠标点击位置的相关教程结束。

《[QGLViewer]3D场景鼠标点击位置.doc》

下载本文的Word格式文档,以方便收藏与打印。