ArcBall+glm 实现射线拾取Ray Picking

在做一个基于qt和opengl的网格变形实验,用户交互方面需要实现射线拾取,框架本身是使用ArcBall实现鼠标拖拽旋转的。探索了几天,使用glm实现了射线拾取

1 射线拾取原理

射线拾取的原理很多博客也讲过了,主要就是:以当前眼睛位置(摄像机位置)为起点,以眼睛位置(摄像机位置)指向鼠标点选位置所对应的世界坐标 的方向为方向,生成一条射线,再判断射线与网格中的各个三角形是否相交。
个人认为重点是得到眼睛位置(摄像机位置)鼠标点选位置所对应的世界坐标

2 实现步骤

2.1 生成射线

  1. 眼睛位置
  vec3 eyepos = eye_distance_*eye_direction_;;            //视点坐标与观察点坐标
    //ptr_arcball_是轨迹球,GetInvertedBallMatrix()是得到旋转四元数构成的矩阵的逆矩阵
    glm::mat4 invertM = glm::make_mat4(ptr_arcball_->GetInvertedBallMatrix());
    glm::mat3 invertM_3 = glm::mat3(invertM); //取前三行&前三列
    glm::vec3 eyepos_glm = glm::vec3(eyepos[0],eyepos[1],eyepos[2]);
    glm::vec3 cameraPos = invertM_3 * eyepos_glm;
  1. 鼠标点选位置对应的世界坐标
    // Get the matrix matView & matProj
    glm::ma
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值