opengl环境下的射线选择

[OpenGL]射线拾取RayPicking---(1)生成射线 Vries的教程是我看过的最好的可编程管线OpenGL教程,没有之一。但没有讲关于拾取(Picking)的章节,而这个功能的确很重要,就自己试着写写看了。 这节有三个很重要的参考网址,基本可以算照抄了????: 1.https://blog.youkuaiyun.com/wind_hzx/article/details/40016619 2. https://blog.youkuaiyun.com/jeffasd/a... 阅读详情

用过OpenGL的人,应该都知道,OpenGL是自带拾取功能的,但用过的人应该也知道,这功能确实不好用。

OpenGL自带的选择功能主要有两种,名字堆栈(拾取)和读深度值判断选择,但这两种方法在实际项目中,未必都好用。

方法一:名字堆栈的方法,需要切换渲染模式,操作命名堆栈,计算拣选矩阵,检查选中记录。当要渲染的数据量特别大或渲染的对象众多时,显然是不可取的。

方法二:glReadPixel方法,读深度值的方法,这种方法比前面一种方法在某些时候稍微好用些,但有一个致命的限制,你鼠标选择的时候,必须选择到绘有实体的地方,否则就得不到正确的深度值。例如你渲染一个三维地形图,地形以Tin的方式渲染,如果你想选择某个顶点,但鼠标落在空白区,你就无法得到正确的深度值,得不到正确的深度值,自然没法根据gluUnproject函数反算到真实的地形坐标点,而实际应用中应该是即使你没完全落在该顶点上,也应该可以根据一个缓冲,在所有缓冲区内部的点集中选择一个距离光标最近的点作为你选择的点。

本文介绍一种方法——射线选择,这种方法也是游戏界和三维地形编程普遍采用的选择方法。

首先介绍一个二维三维坐标转换函数: gluUnProject()

此函数的具体用途是将一个OpenGL视区内的二维点转换为与其对应的场景中的三维坐标。

转换过程如下图所示(由点P在窗口中的XY坐标得到其在三维空间中的世界坐标):

这个函数在glu.h中的原型定义如下:

代码 

//Code highlighting produced by Actipro //CodeHighlighter //(freeware)http://www.CodeHighlighter.com/
int APIENTRY gluUnProject (

    GLdouble       winx, 

    GLdouble       winy, 

    GLdouble       winz, 

    const GLdouble modelMatrix[16], 

    const GLdouble projMatrix[16], 

    const GLint    viewport[4], 

    GLdouble       *objx, 

    GLdouble       *objy, 

    GLdouble       *objz);

其中前三个值表示窗口坐标,中间三个分别为模型视图矩阵(Model/View Matrix),投影矩阵(Projection Matrix)和视区(ViewPort),最后三个为输出的世界坐标值。

第二步,首先获得视图矩阵,投影矩阵,视区三个数组值。

代码 

//Code highlighting produced by Actipro //CodeHighlighter //(freeware)http://www.CodeHighlighter.com/
 GLint    viewport[4]; 
 GLdouble modelview[16]; 
 GLdouble projection[16]; 



 glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数
 glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
 glGetDoublev(GL_PROJECTION_MATRIX, projection);

获取这三个变量的代码,应该放在绘制发生前,三个矩阵定以后。否则glPopMatrix之类的函数,可能导致你无法得到真正的投影矩阵和视图矩阵。

第三步,获取射线。因为两点确定一条线,所以,先通过计算视图最近点和最远点,得到该射线。

代码 

//Code highlighting produced by Actipro //CodeHighlighter //(freeware)http://www.CodeHighlighter.com/
 winX = point.x; 
 winY = screenHeight - point.y; 

//获取像素对应的前裁剪面的点坐标
 bool bResult = 
 gluUnProject(winX, winY, 0.0, modelview, projection, viewport, &posX, &posY, &posZ); 

 FPoint3 nearPoint;

 nearPoint.x = posX; 
 nearPoint.y = posY; 
 nearPoint.z = posZ;
 //获取像素对应的后裁剪面的点坐标
 bResult = gluUnProject(winX, winY, 1.0, modelview, projection, viewport, &posX, &posY, &posZ); 
 FPoint3 farPoint;
 farPoint.x = posX; 
 farPoint.y = posY;
 farPoint.z = posZ;

第四步,计算待选择目标跟该的关系,将与射线距离最近的对象,作为选择对象。

第五步,本文绘制了分布在不同三维空间的5个点,用鼠标右键,可以进行点的选择,如果选中,点会变成黄色,鼠标左键可以随意对这些点进行旋转等。

这里写图片描述

源代码

[OpenGL]射线拾取RayPicking---(2)拾取三角面 Vries的教程是我看过的最好的可编程管线OpenGL教程,没有之一。但没有讲关于拾取(Picking)的章节,而这个功能的确很重要,就自己试着写写看了。 核心代码“参考”网址如下,别问,问就是抄: https://www.cnblogs.com/graphics/archive/2010/08/09/1795348.html PS:博士真难申请!!!!!啊啊啊啊啊啊啊啊啊啊啊啊啊啊... 阅读详情

相关推荐

OpenGL光照追踪

1.光照追踪简介 光线追踪,简单地说,就是从摄影机的位置,通过影像平面上的像素位置(比较正确的说法是取样(sampling)位置),发射一束光线到场景,求光线和几何图形间最近的交点,再求该交点的著色。如果该交点的材质是反射性的,可以在该交点向反射方向继续追踪。光线追踪除了容易支持一些全局光照效果外,亦不局限于三角形作为几何图形的单位。任何几何图形,能与一束光线计算交点(intersection

smsmn的专栏 6046

OpenGL: OpenGL环境下的射线选择

用过OpenGL的人,应该都知道,OpenGL是自带拾取功能的,但用过的人应该也知道,这功能确实不好用。 OpenGL自带的选择功能主要有两种,名字堆栈(拾取)和读深度值判断选择,但这两种方法在实际项目中,未必都好用。 方法一:名字堆栈的方法,需要切换渲染模式,操作命名堆栈,计算拣选矩阵,检查选中记录。当要渲染的数据量特别大或渲染的对象众多时,显然是不可取的。 方法二:glReadPixel方法,

Augusdi的专栏 3485

Qt OpenGL 鼠标拾取实现

在上面的示例中,我们创建了一个名为MyGLWidget的自定义OpenGL窗口,并重写了一些关键的函数,包括initializeGL(用于初始化OpenGL设置)、resizeGL(用于设置OpenGL视口和投影矩阵)和paintGL(用于渲染场景)。然后,我们使用射线的起点为相机位置,方向为鼠标点击位置,通过检测射线与场景中的对象是否相交来实现鼠标拾取的功能。接下来,让我们来实现鼠标拾取的功能。鼠标拾取的基本思路是将鼠标点击的屏幕坐标转换为OpenGL坐标,并检测是否有场景中的对象与该坐标相交。

IqFlask的博客 969

OPENGL 射线拾取法

opengl的射线拾取方法解决记录

gpp6025的博客 3188

opengl拾取操作

就是红宝书的上例子,opengl实现拾取操作,一个作业而已

使用OpenGL实现三维坐标的鼠标拣选_-_Y___Y的专栏_-_优快云博客

使用OpenGL实现三维坐标的鼠标拣选_-_Y___Y的专栏_-_优快云博客

OpenGL—射线拾取(ray pick)

简介: OpenGL中鼠标射线拾取,就是通过鼠标点击屏幕

virwin的专栏 1万+

OpenGL实现三维坐标的鼠标拣选

OpenGL实现三维坐标的鼠标拣选,用鼠标对三维空间的物体进行选取,有很大的实用价值。

OpenGL拾取功能

通过OpenGL实现拾取功能,有两种办法:

Zhanglin_Wu的专栏, C++, Scrum, LLVM, 编译器 493

DreamerV3实战:如何用世界模型在Minecraft中自动挖钻石(附完整训练流程)

本文详细介绍了如何使用DreamerV3世界模型在Minecraft中训练AI智能体自动完成挖钻石的复杂任务。文章深入分析了该任务对强化学习的挑战,提供了从环境配置、模型训练到结果评估的完整实战流程,并分享了关键的调优技巧与问题解决方案,展示了基于模型的强化学习在解决稀疏奖励问题上的强大能力。

weixin_29050271的博客 189

使用Docker搭建SearXNG搜索引擎

【代码】使用Docker搭建SearXNG搜索引擎。

janthinasnail的博客 1154

OpenGL环境下的射线选择

用过OpenGL的人,应该都知道,OpenGL是自带拾取功能的,但用过的人应该也知道,这功能确实不好用。 OpenGL自带的选择功能主要有两种,名字堆栈(拾取)和读深度值判断选择,但这两种方法在实际项目中,未必都好用。 方法一:名字堆栈的方法,需要切换渲染模式,操作命名堆栈,计算拣选矩阵,检查选中记录。当要渲染的数据量特别大或渲染的对象众多时,显然是不可取的。 方法...

weixin_33778544的博客 254

ARM架构UOS实战:从源码编译Qt 5.15.2到定制Qt Creator的全流程解析

本文详细解析了在ARM架构统信UOS系统上,从源码编译Qt 5.15.2到定制Qt Creator开发环境的完整流程。内容涵盖环境准备、依赖部署、源码配置、编译优化、错误处理及IDE集成,旨在帮助开发者在国产化平台上构建自主可控的高性能Qt开发环境,解决特定ARM平台的兼容性与性能优化问题。

mango的博客 410

QT+OpenGL鼠标操作和模型控制

本篇完整工程见gitee:[QtOpenGL](https://gitee.com/turbolove/qtopengl.git) 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主

turbolove的博客 3412

PythonWeb开发框架—Django之工程创建和models的定义和增删改查

文章介绍了Django工程的创建、models的定义和增删改查

weixin_42476668的博客 990

学习记录(十一)--Pattern Recognition投稿记录

上一周特别忽然通知统计建模要答辩,确定是否晋级国赛,一直在准备答辩的事情,所以上一周没有总结周汇报,深刻检讨!!!不过结果是好的,我们组第二名晋级哦。这周主要是跟大家分享一下我投稿PR(Pattern Recognition)的一个时间线,以及投稿后的工作。一、PR从投稿到接收的时间线2025.4.3 Major Revision(ddl4.23) 当时正在弄比赛和另一个着急推进的文章2025.5.30 Minor Revision 这次小修基本上只有一些格式和简单一点点问题。

qq_54949944的博客 1914

WebGL-13.物体拾取

本系列教程主要讲解利用WebGL开发网页版的三维图形程序。这里主要用到的OpenGL和FlyMath内容。本系列内容较难。要求学生对几何和编程有一定的了解。建议初三以上同学学习。在3D环境中,对3D物体进行点击选择是一个常用的技巧。常用有三种方法来对物体选择。第1种是获取渲染屏幕的颜色值来判断选中了那些物体。这个方法效率很高,但是要求物体是纯色或杂色较少。应用环境很窄。第2种是把3D物体的三维坐标重新转换成屏幕坐标,再判断是否选中。在模型复杂的环境时这种方法效率很低,别外无法对选中模型的深度进行排序。

Sun zi chao的博客 277

微生物16S数据上传NCBI的SRA库

本篇内容仅包括:俺自己的实验收集了淡水、淡水沉积物、海水、海草附着微生物样品,测序所得的Fastq格式数据,在文章投稿发表时被要求数据需上传NCBI的SRA库,得到一个PRJNA2347899这样子的IDs。仅解决了这个上传过程!

Xf_Niu的博客 7432

OpenGL 射线选择中射线的生成过程,代码与图示参考

Mouse Picking with Ray Casting在射线选择中,坐标的转换原理: http://antongerdelan.net/opengl/raycasting.html参考: http://blog.youkuaiyun.com/wind_hzx/article/details/40016619构建的视图代码//glm::vec3 cameraPos = glm::vec3(0.0f, 0

... 1795

PCL 中实现平面模型分割【2026最新版】

RANSAC分割平面。博客长期更新,最近一次更新时间为:2026年5月4日。

点云侠的博客 38万+

K230+canMV开发中常见的数据类型转换参考示例

【代码】K230+canMV开发中常见的数据类型转换参考示例。

weixin_47446386的博客 67

opengl es 射线拾取

http://www.ophonesdn.com/forum/viewthread.jsp?tid=6053&authorid=14783    平时爱玩魔方,所以第一个游戏就想写个魔方,先用c++实现了一个MFC版本的魔方,然后移植到android的opengl es 平台上,但是移植的过程中碰到问题了,就是拾取问题。搜索各种资料的时候发现了eoe论坛里面的一个myCubic魔方,实现了自己

夜风的BLOG 4474

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OpenGL实现基本的光线追踪

光线追踪 NZL 21/1/13 一、前言 这是我图形学这门课的期末作业,我觉得还挺有意思的就写一篇博客记录一下。本身这门课学的技术都是四五十年前的了,相当于图形学的入门课程,所以用到的公式,方法可能都过时了。我只是按照老师教的方法,结合一些论文的辅助,把一个基本的光线追踪算法实现了而已,如果有图形学大佬那么尽可以对本文嗤之以鼻。 二、项目结构 由于实现光照渲染需要用到GLSL,而我又没有该方面基础,因此使用了一个模板:framework.h/cpp,它来源于国外一门课程的仓库。按照模板的说明,你不应该动其

weixin_44151650的博客 7969

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android OpenGL射线拾取&手势旋转(二)

上回分解-_-!,Android OpenGL射线拾取&手势旋转(一)。 3)Renderer:RayPickRenderer.java OpenGL渲染器,比较多的东西都在这里面了。 publicclassRayPickRendererimplementsRenderer{ ...

weixin_34357436的博客 146

opengl三维场景漫游_OpenGL实现在三维空间拖拽物体

大瓜子HduGameMaker程序组 组长PROFILE 最近本来想用OpenGL实现一个三维形变平台,但是没想到在鼠标交互这里就遇到了麻烦。OpenGL中并没有很实用的能够处理鼠标拖拽3D物体的办法,而我又不想导入外部的交互框架把程序搞得很冗杂。害,那咋办嘛,只好自己从底层实现这个功能了。1环境说明 这次实验环境是根据LearnOpenGL网站(https:/...

weixin_39978749的博客 634

OpenGL的一些网址

最近在用OpenGL做项目,找了一些学习教程,想着总结一下,以备后用。 OpenGL学习教程: 1、LearnOpenGL (1)LearnOpenGL:https://learnopengl.com/ (2)LearnOpenGL中文网址:https://learnopengl-cn.github.io/ (3)LearnOpenGL视频教程:https://www.bilibili.com/v...

qq_40291844的博客 1149
上一篇: OpenGL VBO顶点缓冲的使用
下一篇: [翻译]随机分形地形生成
code_xbug
博客等级 码龄13年 26粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值