首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GLSL在鼠标上突出显示网格

GLSL在鼠标上突出显示网格
EN

Stack Overflow用户
提问于 2018-01-19 19:20:06
回答 1查看 1K关注 0票数 1

我正在为我的opengl项目做一个扫描程序,我希望能够突出我悬停在上面的网格部分。

我从鼠标位置得到一个方向矢量,使用如下:

代码语言:javascript
运行
AI代码解释
复制
glm::vec3 Engine::Physics::RayCast::ViewToWorldSpace(glm::vec2 screenPos, 
float depth, glm::mat4 projection, glm::mat4 view, graphics::Window* window)
{
//Screen to Normalised Device Coordinates
float x = (2.0f * screenPos.x) / window->getWidth() - 1.0f;
float y = 1.0f - (2.0f * screenPos.y) / window->getHeight();
float z = 1.0f;
glm::vec3 ray_nds = glm::vec3(x, y, z);

//Normalised Device Coordinates to 4d Homogeneous Clip Coordinates
glm::vec4 ray_clip = glm::vec4(ray_nds.x, ray_nds.y, -1.0, 1.0);

//4d Homogeneous Clip Coordinates to Eye (Camera) Coordinates
glm::vec4 ray_eye = glm::inverse(projection) * ray_clip;
ray_eye = glm::vec4(ray_eye.x, ray_eye.y, -1.0, 0.0);

//Eye (Camera) Coordinates to 4d World Coordinates
glm::vec3 ray_wor = glm::inverse(view) * ray_eye;
ray_wor = glm::normalize(ray_wor);
return ray_wor;
}

然后我想检查我是否指向一个网格的一部分,所以我把相机的位置和这个方向矢量传递给这些阴影。

顶点

代码语言:javascript
运行
AI代码解释
复制
#version 410

layout (location = 0) in vec3 vertex_position;
layout (location = 2) in vec2 VertexUV;

uniform mat4 P;
uniform mat4 V = mat4(1.0);
uniform mat4 M = mat4(1.0);
out vec2 uv;
out vec4 position;

uniform vec3 cam_pos;
out vec3 cameraPos;
uniform vec3 ray_dir;
out vec3 rayDir;

void main () {

rayDir = vec3(M * vec4(ray_dir,1.0));
cameraPos = vec3(V * M * vec4(cam_pos,1.0)); 
gl_Position = P * V * M * vec4(vertex_position, 1);
position = V * M * vec4(vertex_position, 1.0);
uv = VertexUV;
}

破骨

代码语言:javascript
运行
AI代码解释
复制
#version 410

out vec4 fragment_colour; // final colour of surface

in vec4 position;
in vec2 uv;

uniform vec3 light_pos;
uniform vec3 light_ambient;
uniform sampler2D texture2D;

in vec3 cameraPos;
in vec3 rayDir;

void main () {
vec4 test = vec4(0, 0, 0, 0);

vec3 vDir = normalize(position.xyz - cameraPos);
float cosAngle = dot(vDir, rayDir);
float angle = degrees(acos(cosAngle));

if(angle < 5)
{
    test = vec4(1, 0, 0, 1);
}


float intensity = (1.0 / length(position.xyz - light_pos))+0.25;
intensity = clamp(intensity, 0, 1);
vec4 ambient = vec4(light_ambient, 1);
fragment_colour = ((vec4(texture(texture2D, uv).rgb, 1.0) * intensity) * 
ambient)+test;
}

目前,我可以看到高亮部分,有时在特定的相机旋转(相机轨道围绕模型),但它从来没有真正跟随鼠标时,相机正对着-Z轴。知道我做错了什么吗?

这是一个它与相机排队工作的礼物,但请记住,如果相机移动,它就会断裂。

以正确的摄像机角度工作

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-20 02:43:27

在渲染中,场景的每个网格通常由模型矩阵、视图矩阵和投影矩阵进行转换。

  • 投影矩阵: 投影矩阵描述从场景的三维点到视口的2D点的映射。
  • 视图矩阵: 视图矩阵描述观看场景的方向和位置。视图矩阵从沃尔德空间转换到视图(眼睛)空间。
  • 模型矩阵: 模型矩阵定义了场景中网格的位置、方向和相对尺寸。模型矩阵将网格的顶点位置转换为世界空间。

您决定使用视图空间坐标在片段着色器中执行操作。

在片段着色器中,顶点位置(position)在视图空间中,因为您在顶点着色器中转换了它。通过矩阵M将模型的顶点转化为世界空间,通过矩阵V将模型的顶点从世界空间转化为视图空间。

代码语言:javascript
运行
AI代码解释
复制
position = V * M * vec4(vertex_position, 1.0);

但是,相机的位置坐标(cam_pos)是世界空间坐标。这意味着您只能通过视图矩阵V来转换它。

代码语言:javascript
运行
AI代码解释
复制
cameraPos = vec3( V * vec4(cam_pos, 1.0) ); 

注意,这个操作的结果总是vec3(0.0, 0.0, 0.0),因为摄像机的视图空间位置是视图空间的起源。眼睛位置定义了视图空间系统(矩阵)的起源:

代码语言:javascript
运行
AI代码解释
复制
cameraPos = vec3( 0.0, 0.0, 0.0 ); 

此外,rayDir是一个方向向量,而不是点。这意味着您不能将其转换为4*4矩阵,因为您不希望将矩阵的翻译部分应用于它。通常,在转换方向向量时,必须使用4*4矩阵左上角3*3的转置逆。但是由于视图矩阵是正交矩阵,所以使用左上角3*3就足够了。

rayDir是世界空间中的一个方向,所以您只能通过视图矩阵V来转换它。

代码语言:javascript
运行
AI代码解释
复制
rayDir = mat3(V) * ray_dir;

注意,如果您省略了光线从视图空间到世界空间的转换,在函数Engine::Physics::RayCast::ViewToWorldSpace

代码语言:javascript
运行
AI代码解释
复制
// glm::vec3 ray_wor = glm::inverse(view) * ray_eye; // skip this
ray_eye = glm::normalize(ray_eye);
return ray_eye;

然后,您也可以省略顶点着色器中的向后转换:

代码语言:javascript
运行
AI代码解释
复制
rayDir = ray_dir;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48352274

复制
相关文章
如何更深层次的思考,缩小你与神的差距
话不多说,直接上图 图片发自简书App 人不是一生来就会画出那么骏的马,如图所述,从一开始的两个小圈圈,到接下来的小腿以及脖子,到后来的萌萌哒的小脸,再后来的毛发,到最后与马神似。这一步步的过程是我们
gfu
2019/08/28
4360
如何更深层次的思考,缩小你与神的差距
递归层次汇总查询
在一个数据仓库项目中,人员、组织机构、事实表是这样设计的: 组织机构是一个树形结构 每一个人员只属于一层组织机构,该层为叶子节点和非叶子节点均可 事实表存储每个人员的数据 要求按组织机构层次汇总数据,别且可下钻。 -- 建立测试表 -- 1. 组织机构 CREATE TABLE org ( org_id NUMBER, org_name VARCHAR2 (100), p_org_id NUMBER ); -- 2. 职员 CREATE TABLE emp
用户1148526
2019/05/25
9010
CUDA学习第24课:直方图更深层次的思考
UDACITY学院在2013年-2015年期间已经做了一套完整的CUDA培训的教材非常适合CUDA初学者。我们会陆续整理(合并视频,贴上中文字幕等),然后发布出来,供初学者学习。
GPUS Lady
2020/03/17
5670
SQL 高级查询 ——(层次化查询,递归)
层次化结构可以理解为树状数据结构,由节点构成。比如常见的组织结构由一个总经理,多个副总经理,多个部门部长组成。再比如在生产制造中一件产品会有多个子零件组成。举个简单的例子,如下图所示
Lenis
2019/12/25
3.9K0
SQL 高级查询 ——(层次化查询,递归)
‘0.99999…’真的等于‘1’吗?这个问题揭示了数学所面临的更深层次的哲学挑战!
如果需要为无限小数“0.99999...”分配一个精确的值,会怎么做?数学直觉说它可能大约等于“1”。但如果你和我一样好奇,就会出现以下一系列问题:
deephub
2022/03/12
2.7K0
‘0.99999…’真的等于‘1’吗?这个问题揭示了数学所面临的更深层次的哲学挑战!
巧妙利用剪切进行强制卸载
虽然现在网络上有众多的强制卸载软件,用过几个像冰刃、网吧幽灵等软件进行过强制卸载,对大部分软件还是很管用的,不过有时候就遇到很难卸载的, 用这些软件都卸载不了。为此专门去网上看了些教程,不过貌似要修改
Youngxj
2018/06/07
9300
二叉树遍历算法递归实现+层次遍历
<img src="https://irabbit756.oss-cn-shanghai.aliyuncs.com/数据结构/二叉树遍历/1二叉树层次遍历.png" style="zoom: 67%;" />
犰兔
2020/11/20
1.4K0
linux如何强制结束程序
第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:第一步查询比较详细的进程信息:ps -aux第二步结束程序kill -s 9 查到的PID号
狼啸风云
2019/04/01
5.5K0
如何强制删除电脑文件?
哈喽!各位小伙伴大家好呀! 相信大家一定遇到过删除某些文件时, 提示“该文件正被别的进程使用,不能删除”, 又或者提示“找不到该项目”等。 如果遇到这些情况应该如何删除呢? 首先,在删除之前要
简单并不简单
2019/10/29
5.6K0
如何强制删除电脑文件?
如何通过node.js对数据进行MD5加密
实际工作开发中,是不会有人直接将密码明文直接放到数据库当中的。因为这种做法是非常不安全的,一般都要对其进行MD5加密!比如某用户的密码是“123456“(当然这样的密码也没有安全性可言),经过MD5处理后即为:“e10adc3949ba59abbe56e057f20f883e”。这样做的好处主要有以下两点:
用户1272076
2019/03/26
3.7K0
Ubuntu 如何强制时间同步
最好的办法就是启动 NTP 进程。 强制同步 sudo ntpdate -s time.nist.gov 上面的命令将会强制同步本地计算机上的时间。 查看进程状况 sudo service ntp status 上面的命令能够查看 NTP 的状态。 启动进程 sudo service ntp start 上面的命令将会启动 NTP 进程。 https://www.ossez.com/t/ubuntu/13526
HoneyMoose
2021/07/03
1.6K0
Ubuntu 如何强制时间同步
如何更深入地理解Java编程中的框架部分
在很多年以前,Java程序员做项目使用的是SSH框架。SSH框架一般指的是Struts、Spring、Hibernate,到后来Struts2代替了Struts,而最近5年,Struts2已被Spring MVC代替, Hibernate基本也被iBatis/MyBatis代替。可见技术的更新还是非常迅速的。 于是,重点就出来了。在这当中Spring已久坚挺,学习Spring你需要了解两个概念AOP和IOC,更进一步就是Spring的核心技术“动态代理”。 对于持久层框架Hibernate/iBatis
企鹅号小编
2018/02/02
9740
如何更深入地理解Java编程中的框架部分
PostgreSql pageinspect 更深的理解PG
如果使用MYSQL 相对页面的层次进行一些了解,估计你就的找大佬们的工具集合,并且为此膜拜大佬们,但PG并不需要这样,PG自身自带的pageinspect 工具,就可以让你对页面级别的层次来进行一个 “透心凉” 的查看和分析,并不在为此苦恼。
AustinDatabases
2020/05/09
1.6K0
Nginx配置Https并进行Http强制跳转Https
首先我们先了解为什么要做https? https现在是一个趋势这样在别人去访问的时候是会显示一个安全的连接,可以去看看各大网站等… 先获取证书 这里就不介绍了 获取的地方有很多 可以进行正规渠道的购买或者使用openssl工具进行获取
全栈程序员站长
2022/06/29
1.1K0
Nginx配置Https并进行Http强制跳转Https
Nginx配置Https并进行Http强制跳转Https
首先我们先了解为什么要做https? https现在是一个趋势这样在别人去访问的时候是会显示一个安全的连接,可以去看看各大网站等… 先获取证书 这里就不介绍了 获取的地方有很多 可以进行正规渠道的购买或者使用openssl工具进行获取
互联网-小阿宇
2022/11/21
1.8K0
Nginx配置Https并进行Http强制跳转Https
如何让oracle的select强制走索引
大多数情况下,oracle数据库内置的查询优化策略还是很成功的,但偶尔也有犯2的时候,即使有索引,也会做全表扫描,可以参考以下语句的写法,强制让select语句使用索引 1 CREATE OR REPLACE VIEW V_RES_CBA AS 2 SELECT /*+INDEX(SEG IDX_T_RES_ALLOSEG_ALLOID)*/ 3 ALLO.ALLOID AS RESID, 4 NULL AS AWB, 5 ALLO.ALLOTMENT AS ALLO_ID,
菩提树下的杨过
2018/01/19
1.3K0
利用spark进行层次社团发现(louvain算法测试)
社团是复杂网络科学中一种重要的拓扑结构,也是物以类聚,人以群分自然现象在网络中的一种反映。因此对复杂网络进行社团发现是SNA(社会网络分析)中重要的内容之一。
sparkexpert
2022/05/07
3510
SQL如何实现MYSQL的递归查询,SQL实现MYSQL递归
所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的。这个得益于Mysql允许在SQL语句内使用@变量。以下是示例代码。
IT小马哥
2020/03/18
5.1K0
Epic Games:在教育领域寻求与更多中国高校,进行更深入的合作
临近年底,VRPinea例行的厂商回访已临近尾声,本文为最后一篇年终回访稿件。前十二篇专访为黑盾、HADO、小派科技、青瞳视觉、VeeR、NOLO VR、火柴全景VR、Sandman Studios、美益添VR、珞麟科技、指挥家VR、睿悦信息Nibiru。本次厂商年终回访对象,涵盖VR/AR硬件、VR/AR游戏、VR/AR解决方案、VR影视等领域。本文的采访对象为Epic Games。
VRPinea
2019/04/29
8880
Epic Games:在教育领域寻求与更多中国高校,进行更深入的合作
如何使用 .htaccess 强制访问 HTTPS
如果你为你的域名安装 SSL 证书,你的下一步应该是配置应用将所有的网络流量通过 HTTPS 传输。
雪梦科技
2020/07/08
4K0

相似问题

SqlDataAdapter和SqlDataReader

20

如何同时运行SqlDataReader和SqlDataAdapter?

20

Compact vs SqlDataAdapter

10

SP返回输出,但SqlDataReader/SqlDataAdapter未返回

10

使用SqlDataAdapter对SqlDataReader源代码进行分页

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档