最近应老大的需求,让我去整一个求出模型里能容纳的最大长方体,要考虑旋转,位移,性能等要求。
为什么要搞这个b东西呢
其实就是他们有个遮挡剔除的demo,可以设计一个东西为遮挡物,让其他东西为被遮挡物,这遮挡物拦在前面的时候,被遮挡物就可以被遮挡了
就像这个cube2,
遮住的时候就会自动隐藏了,关键是他这玩意还只能用球形和立方体作遮挡物,所以他就给我提了这玩意,让我算出来。
让我回去想了一天,我说想不出来,本来以为老大能有什么牛逼的方法,但实际上也就提了下射线检测和正交矩阵,意思是要求出xmin,ymin,zmin,xmax,ymax,zmax就能确定长方体的范围了,意思是可以分开求前面的面的面积最大,在考虑侧面的,上下可以不考虑。具体怎么求,他也讲了一下,但他讲完一下我就发觉其实他也不是很清楚。唉.
然后我还是决定自己想个办法,发现leetcode上的最大矩形可以满足正交情况下求出某个面的最大矩形来,所以可以从这里入手
假设形状的面积主要在前后面比较大,像这样,那就先计算前后面的最大矩形,算出来就能得出xmin,xmax,ymin,ymax,就有了y的范围,之后再到侧面去求z的范围。如果是侧面比较大,就反过来,我懒,就只算正面的。
先得出中心点(所有顶点相加取平均)
按leetcode题意,先得出二维数组,每个单元有模型是1,空的是0
如何检测是否有模型,就用碰撞,发射线检测.
我这里用的是球形射线
结果如上图.
得到数组之后就可以利用leetcode的柱状图解法,求出最大面积,和能求出的最大面积的行数,列数,宽高了,由此求出x,y范围,
然后从侧面观察,继续用射线在(ymin+ymax)/2的高度上,检测zmin是多少和能达到的zmax是多少。
一般结果就还ok的。
然后是结果的样子。
我根据min,max drawmesh生成了一个cube,
复杂一点的模型。
复杂一点的模型把精度调开。
然后这种解法基本就是和碰撞器是紧密联系的。做得时候是基于无旋转来做的,用的射线,跟位移没有关系,所以不用考虑坐标的问题,所以有旋转的时候,就先记录旋转,reset模型,然后算完,把生成的cube绑定在模型里面,再把模型转回去就行了。
不过我本人觉得这种解法还是粗糙,这种东西要有好的解法肯定是有的,但是本来就应该不是我能想的出来的,这老板也真是心血来潮,这种东西,真要好的计算,本来我觉得你要么就从图像处理,边缘检测的角度出发,让计算机拥有视觉,像这种从碰撞出发,还不如有一个模型的时候人为手动挂一个特殊碰撞体矩形范围,然后代码就读这个就好了,还省了计算的时间,这种需求真感觉多此一举。