QT框架下的OpenGL使用---实战篇---鼠标选取点对象

本篇文章是点云显示和交互以及摄像机这两篇文章的后续,如有疑惑可查看这两篇文章。

在OpenGL的使用中,用其显示3D点云是非常常见的操作,而进一步让用户可以选择点云以查看其信息可以使得开发变得更加简单,本篇文章我们将讨论怎么实现这一功能。

要用鼠标圈选点云,要解决的问题就是得到鼠标圈选的范围内有哪些点,也就是要知道OpenGL的顶点到屏幕坐标之间的映射关系。这一映射关系我们在摄像机这篇文章已经得到了,它就是:

QMatrix4x4 mvp;

这个对象,我们在顶点着色器中用它和顶点坐标相乘直接得到了顶点的3D坐标:

gl_Position = MVP * vec4(posVertex, 1.0f);

因此如果我们在鼠标圈选之后遍历所有的点,然后再计算一遍这个投影关系,就可以知道哪些点是在圈选的范围内的点,代码和解释如下:

for (int i = 0; i < 230400; i++)
{
    QVector4D screen = mvp.map(QVector4D(QVector3D(vertices[i * 6 + 0], vertices[i * 6 + 1], vertices[i * 6 + 2]), 1.0f));
    //QVector4D是四维的齐次坐标,需要将前三维的值除以第四个维度的值,以转换到笛卡尔坐标系下
    if (screen.w() != 0.0f)
    {
        screen.setX(screen.x() / screen.w());
        screen.setY(screen.y() / screen.w());
        screen.setZ(screen.z() / screen.w());
    }
	//这里我们直接选择了x,y轴-0.5~0.5的点,也就是OpenGL显示框内中心长宽为显示框一半的矩形圈内的点,如果想实现鼠标圈选,则再做一次鼠标圈选范围到OpenGL显示框的映射关系就可以了。需要注意的是OpenGL显示宽的长和宽都是用-1~1进行表示的。
    if (screen.x() > -0.5 && screen.x() < 0.5 && screen.y() > -0.5 && screen.y() < 0.5)
    {
    }
}

参考文章

https://blog.csdn.net/weixin_42108411/article/details/105392471

https://www.cnblogs.com/icmzn/p/7373663.html

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值