opengl学习之半工半读写毕设(六)

赞美chatgpt门!!
记录一下完成选中/拾取/摆放场景中的物体功能(关键词:射线拾取 ray-AABB slabs-method 碰撞检测)时遇到的问题及解决方法

为了实现鼠标点击拾取场景中的物体,需要

  1. 把储存地形的数据结构改一下,改成hash,unorderedmap,检索方便,而且添加或者删除也方便
    unorderedmap:
    它是一个关联容器,内部采用的是hash表结构,拥有快速检索的功能。通过key去检索value,而不是通过绝对地址(和顺序容器不同)。Map : 每个值对应一个键值
    常用函数:
    find()函数——查找,找到返回迭代器,失败返回end()
    emplace()函数——插入元素(转移构造)
    erase()函数——删除元素

  2. 对物体加包围盒,
    由于物体都是正方体(不是正方体的不给拾,差不多得了),所以采用最简单的aabb包围盒。aabb包围盒就是一个四四方方的盒子,正好把模型完整的框在里面,它的坐标轴也是横平竖直的,不能转方向。干说可能看不出来,看图就明白了,但反正也没人看就不放图了。不过其实也不需要在代码里特别的去写aabb,只要在第四步中传入aabb盒的min max高就可以了

  3. 用射线拾取,通过矩阵逆变换(就是摄像机那一章的有很多矩阵相乘的公式逆变换),将鼠标点击的视口坐标转换到世界坐标,获得1)由摄像机原点指向鼠标点击的一条射线D,2)摄像机原点O两个参数

  4. 碰撞检测,遍历世界中的所有小方块,用算出来的这条射线与AABB包围盒的三个面做ray-AABB,判断射线与平面是否相交(slabs-method),这里的代码可以看Time-rendering这本书

  5. 如果射线与某个小方块发生碰撞,用1里提到的函数删除之

注:我一开始用来储存地形的数据结构是[80][80]的向量,但是由于向量增加或删除不是很方便,每次改变都要另存为,所以帮我改的老师用了unorderedset来储存。在unorderedset里储存了小方块的在xyz轴平移的信息,是否destory,hash,方块头上长什么植物模型,方块的纹理id

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值