赞美chatgpt门!!
记录一下完成选中/拾取/摆放场景中的物体功能(关键词:射线拾取 ray-AABB slabs-method 碰撞检测)时遇到的问题及解决方法
为了实现鼠标点击拾取场景中的物体,需要
-
把储存地形的数据结构改一下,改成hash,unorderedmap,检索方便,而且添加或者删除也方便
unorderedmap:
它是一个关联容器,内部采用的是hash表结构,拥有快速检索的功能。通过key去检索value,而不是通过绝对地址(和顺序容器不同)。Map : 每个值对应一个键值
常用函数:
find()函数——查找,找到返回迭代器,失败返回end()
emplace()函数——插入元素(转移构造)
erase()函数——删除元素 -
对物体加包围盒,
由于物体都是正方体(不是正方体的不给拾,差不多得了),所以采用最简单的aabb包围盒。aabb包围盒就是一个四四方方的盒子,正好把模型完整的框在里面,它的坐标轴也是横平竖直的,不能转方向。干说可能看不出来,看图就明白了,但反正也没人看就不放图了。不过其实也不需要在代码里特别的去写aabb,只要在第四步中传入aabb盒的min max高就可以了 -
用射线拾取,通过矩阵逆变换(就是摄像机那一章的有很多矩阵相乘的公式逆变换),将鼠标点击的视口坐标转换到世界坐标,获得1)由摄像机原点指向鼠标点击的一条射线D,2)摄像机原点O两个参数
-
碰撞检测,遍历世界中的所有小方块,用算出来的这条射线与AABB包围盒的三个面做ray-AABB,判断射线与平面是否相交(slabs-method),这里的代码可以看Time-rendering这本书
-
如果射线与某个小方块发生碰撞,用1里提到的函数删除之
注:我一开始用来储存地形的数据结构是[80][80]的向量,但是由于向量增加或删除不是很方便,每次改变都要另存为,所以帮我改的老师用了unorderedset来储存。在unorderedset里储存了小方块的在xyz轴平移的信息,是否destory,hash,方块头上长什么植物模型,方块的纹理id