首页 > 编程语言 >理解opengl坐标变换(从逆变换入手)--实现鼠标点击发射射线的算法

理解opengl坐标变换(从逆变换入手)--实现鼠标点击发射射线的算法

时间:2022-11-02 17:36:35浏览次数:42  
标签:鼠标 opengl -- 像素 射线 点击 坐标 逆变换

首先上结果(不会在博客园传视频、具体流程是鼠标点击屏幕上的任意一个点、向此处投射一条射线):

 


 

 实现的方法:

首先认清楚什么是一条射线、由于我们不是真的要画一条无限长度的线、那么用线段的起始和终止(当然是在世界坐标系里的起点和终点)就能代表这条射线、具体的shader可以用基本的MVPshader。

这个Ray类只是简单的用起点和终点画一条线而已,其中的 t 可以用来和别的表面求交点、所以暂时保留

 具体的、我们使用GLFW做窗口系统、先给GLFW注册一个点击事件函数、响应鼠标左键的单击、并且拿到像素坐标:

(mouseX,mouseY)就是鼠标点击处的像素坐标!(左上角xy都最小,右下角xy都最大)

这里开始就比较有意思了、

首先:正着来的变换流程:

  模型--》世界--》观察变换(view)--》视锥体投影--》glViewPort转像素坐标

那么反着来、就需要先把(mouseX,mouseY)这种像素坐标转换到 [-1,1]的范围内:

 mouseX,mouseY在窗口左上角时为(0,0),可以代入这个公式里、发现 x = -1, y = 1,回忆 opengl NDC相关的知识、左上角确实是 (-1,1)!这个公式的正确性可以简单体会一下

关键在于 z 值的理解!z可以取 -1 或者 1、取 -1 代表我们鼠标点击的那一下是点到了【近平面】上、取 1 表示点击到了【远平面】上!

这里看图(鼠标画的确实不好看、将就一下!):

我们在屏幕上点了一下鼠标、要发射一条射线的话、需要确定起点和终点、起点一般就是我们的相机、而终点就是图上画的两个红色的 X 号、

相机和红色 X 之间的连线就是射线!我们取 z = -1 表示是近平面是那个红X、取 z = 1表示要取远平面的那个红X,其实两者和眼睛的连线是共线的,想取别的 z、只要在【-1,1】范围内、都是可以的、取远平面只是效果好点!

但取远平面能把线拉的长一点、方便观察结果!

 

 我们现在已经完成了像素--》NDC的转换、

回顾正着变换的方程:

Position(NDC) = P*V*Position(世界);

那么(简单移项):

Positon(世界) = 逆(P*V) * Position(NDC)

所以我们有:

 这样就能把屏幕转世界了

最后、new一个Ray对象(起点是相机位置、终点是逆变换到世界系的点)、放到全局的一个容器里、每次render时遍历容器(这里使用多态去处理、I_Drawable就是个接口):

后面就可以用 Ray 去做很多别的操作了!

完整工程下载:

链接:https://pan.baidu.com/s/1GFq0DIjHJMpG_u1U2ljiiA
提取码:s2m5

 

标签:鼠标,opengl,--,像素,射线,点击,坐标,逆变换
From: https://www.cnblogs.com/gs590/p/16851336.html

相关文章

  • 利用node+express+node-media-server 实现直播功能
    github.com: https://github.com/whiskyma/node-media-server参考文献:1、https://www.huiyani.com/archives/4703/2、https://blog.csdn.net/CSDNzhaojiale/article/d......
  • 实验7:基于REST API的SDN北向应用实践
    实验目的能够编写程序调用OpenDaylightRESTAPI实现特定网络功能;能够编写程序调用RyuRESTAPI实现特定网络功能。实验要求(一)基本要求编写Python程序,调用OpenDayl......
  • 关于paddleocr2.6 布局分析的踩坑总结(一)
    8月24日paddleocr发布了2.6.0,之前使用过2.5版本的布局分析,整体比较好用。近期就尝试了一下paddleocr的新版本,记录一下尝鲜经历。2.6版本的公告中指出,布局分析模型缩小......
  • Maven私有仓库nexus配置
    一、先安装jdk和mavenmaven下载地址:http://maven.apache.org/download.cgijdk下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html将......
  • AI智能检测识别EasyCVR视频融合平台告警抓拍图片的逻辑优化
    将智能分析网关的AI智能识别能力与EasyCVR视频融合平台的视频服务能力融合,构建基于云边端协同架构的安全风险监测与视频监管平台,可对接入的多路视频流进行智能检测、智能识......
  • Linux 循环,格式以及使用方法
    ​for循环:(每读取一行在字符串下面添加#号)[root@localhost]#cat/etc/passwd|awk-F':''{print$3}'|tail-5>test1.txt[root@localhost]#cattest1.txt98972......
  • 2022CCPC(桂林)
    我的首站本来想着练练手拿铜牌血赚打铁不亏结果保底铜牌要是G题做出来应该可以冲击一下银牌https://codeforces.com/gym/104008A.Lily签到题:所有不在L旁的字符......
  • JAVA中的堆栈数据存储
    结论引用类型,总是储存在堆上(数组同样属于引用类型,只不过他是使用c实现的);基础类型,在方法中的局部变量储存在栈,对象实例中的实例字段则随对象一同存储在堆上;线程享有自......
  • 24.互相喜欢,喜欢,粉丝 - 统计
    互相喜欢,喜欢,粉丝-统计思路分析代码实现,首先构造vo返回对象,里面封装的是统计的数据数量packagecom.tanhua.model.vo;importlombok.AllArgsConstructor;importl......
  • 产品速递|璞华易投社保基金管理系统,数据赋能保障社保基金安全
    社保基金事关人民群众切身利益。近年来,人社部完善政策、规范管理、严格内控、强化监督,不断加强社保基金管理风险防控。其实,在加强基金监督管理方面,最简单粗暴、行之有效......