项目需要计算物体的以局部坐标系为基准的长宽高,用来做3D物体的材质赋值了图片之后,能够正确拉伸物体来让图片按照正确的比例显示, 这不是OBB嘛,但是Unity提供的MeshRenderer的Bounds是AABB,Unity也没有提供其他关于OBB的属性或者组件等。
因为一直为相当多的功能提供支持, 后面就一直在维护和扩展着这个库。
最开始的思路所以思路是
- 通过AABB求出OBB
- 通过重新计算mesh上面的每个顶点,求出OBB.
思路一一开始我是觉得无解的,后面在对OBB做了比较多的应用拓展之后觉得, 将AABB上的八个端点转换到OBB的物体的局部坐标中,因为这八个端点的各个分量各自代表了AABB在世界坐标系中的最大分量或者最小分量,将这八个点转换到局部坐标后,对各个分量进行比较,得到各个分量的最大和最小值,这些值最后就可以生成OBB了。 这个思路和将其他的OBB包含在里面是差不多的, 感觉是可行的,但是思路一的方法我没有去实现。
思路二自己有以往的经验,能够想到大体的解决思路。只是这种在单核CPU遍历顶点的方法可能会造成卡顿,所以这个方法的升级版就是用多线程或者协程来做。
在遍历顶点计算AABB的时候,是根据每个顶点的世界坐标,然后记录当前的所有顶点坐标xyz三个分量的最大值和最小值,最后xyz每一位都有最大值和最小值,三个位组成八种组合就代表了这个AABB的八个面。
那么遍历顶点计算OBB的时候,比AABB只是多了一步,就是先将顶点从世界坐标转换到模型空间坐标。上面的是比较早期的想法, 现在已经支持几种方式创建OBB了。
这个OBB包的可视化调试需要导入配合3D调试工具