Unity遮挡剔除-求出模型内最大立方体

博主应老大需求,要在模型中求出能容纳的最大长方体,需考虑旋转、位移和性能。老大提出射线检测和正交矩阵思路,但未讲清具体方法。博主借鉴 leetcode 最大矩形解法,通过碰撞检测得出二维数组,利用柱状图解法求出最大面积及范围,还考虑了旋转情况,该方法可用于批量自动生成模型碰撞体。

最近应老大的需求,让我去整一个求出模型里能容纳的最大长方体,要考虑旋转,位移,性能等要求。

为什么要搞这个b东西呢

其实就是他们有个遮挡剔除的demo,可以设计一个东西为遮挡物,让其他东西为被遮挡物,这遮挡物拦在前面的时候,被遮挡物就可以被遮挡了
在这里插入图片描述
就像这个cube2,

在这里插入图片描述
在这里插入图片描述
遮住的时候就会自动隐藏了,关键是他这玩意还只能用球形和立方体作遮挡物,所以他就给我提了这玩意,让我算出来。

让我回去想了一天,我说想不出来,本来以为老大能有什么牛逼的方法,但实际上也就提了下射线检测和正交矩阵,意思是要求出xmin,ymin,zmin,xmax,ymax,zmax就能确定长方体的范围了,意思是可以分开求前面的面的面积最大,在考虑侧面的,上下可以不考虑。具体怎么求,他也讲了一下,但他讲完一下我就发觉其实他也不是很清楚。唉.

然后我还是决定自己想个办法,发现leetcode上的最大矩形可以满足正交情况下求出某个面的最大矩形来,所以可以从这里入手在这里插入图片描述
在这里插入图片描述
假设形状的面积主要在前后面比较大,像这样,那就先计算前后面的最大矩形,算出来就能得出xmin,xmax,ymin,ymax,就有了y的范围,之后再到侧面去求z的范围。如果是侧面比较大,就反过来,我懒,就只算正面的。

先得出中心点(所有顶点相加取平均)
按leetcode题意,先得出二维数组,每个单元有模型是1,空的是0

如何检测是否有模型,就用碰撞,发射线检测.
在这里插入图片描述
我这里用的是球形射线
在这里插入图片描述
结果如上图.
得到数组之后就可以利用leetcode的柱状图解法,求出最大面积,和能求出的最大面积的行数,列数,宽高了,由此求出x,y范围,
然后从侧面观察,继续用射线在ymin 到 ymax 之间的高度上,检测zmin是多少和能达到的zmax是多少。

一般结果就还ok的。

然后是结果的样子。
在这里插入图片描述
我根据min,max drawmesh生成了一个cube,在这里插入图片描述
复杂一点的模型。

弄了一个编辑器
在这里插入图片描述

还做了个球体的,如果是球体就从面积可能更小的那个面求出最大正方形,就容易做了。
在这里插入图片描述
这是立方体

然后这种解法基本就是和碰撞器是紧密联系的。做得时候是基于无旋转来做的,用的射线,跟位移没有关系,所以不用考虑坐标的问题,所以有旋转的时候,就先记录旋转,reset模型,然后算完,把生成的cube绑定在模型里面,再把模型转回去就行了。

这东西有什么用呢,应该是批量自动生成模型碰撞体用的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustEasyCode

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值