动态生成长条立方体

背景

最近有一个需求, 根据一条线(实际是一系列的点集)生成一个长方体, 也就是本来显示线,就很简单了, 但是现在不要显示为线, 而是要显示为长条形的线, 也就是一个长的立方体, 这个立方体是可以任意弯曲, 有任意的形状.

过程

解决过程很曲折, 所以我想写下来,记念一下.

Try

我第一次是在每个点上做向外扩展四个点, 这四个点就是原始点 x,y 加减 w/2, h/2, 然后再把这些点组织成三角形.

结果:
在 x, y 往外扩其实只有在线是在 z 方向上, 才可以,要是线在 x 方向, 明显就不行了

Try Try

吸取了上一次的教训, 我意识到, 点向外扩没有问题, 但是这个外扩其实是在原始点所在的平面来做的, 而这个平面与点所在的坐标系基本不会是一致的.

那么这个平面上的四个点, 应该怎么确定呢, 我找到以下几个已知条件,等式

  • 平面与法线垂直, 所以 P*N = 0, P 就是四个外扩点到原始点的的向量, N 可以用下一个点成当前点的向量的值
  • 同时我们的这个长方体的截面是有固定大小的, 所以 pow(P, 2) = pow(w/2, 2) + pow(h/2, 2)
  • 我们还可以把P 的y值直接固定下来

有以上三个条件, 只有P是未知, P 是一个向量, 有三个值, 现在我们有三个等式, 那这个P应该是可以计算出来的.

事实的确可以计算出来. 后文我给出一个源码, 里面有一个 ExpandPoints_Useless 就是在做这个计算.

结果:
这样计算出来的值, 不只有四个, 可能有8个, 这因为方程解出来求开方的结果有两个值, 需要自行再去判断, 同时方程计算中,还要考虑边界除0的问题.
所以这样来计算还是不太好

Try Try Try

好了, 解方程理论上可行, 但是过程很复杂, 还有很多边界要处理. 在解决边界问题时, 我突然想到了, 平面与法线这两个元素, 平面上再取 x,y分量, 这不就是一个坐标系吗, 那么我可以在平面上直接取四个点, 然后再把平面旋转到原始点所在的坐标系的位置就可以了啊.

所以方法来了, 通过法线就可以知道, 两个坐标系之间的旋转矩阵, 平面上的四个点,就简单了,直接取值就好, 旋转后就是我们 Mesh 的顶点位置了.

这里有对应的实现

https://github.com/hugohuang1111/ufxcase/blob/master/Assets/Scripts/DynamicLongCube.cs#L217

方案

具体的实现可以看这里, 其中对于三角形面的处理也有介绍

https://github.com/hugohuang1111/ufxcase/blob/master/Assets/Scripts/DynamicLongCube.cs


转自: HH

你可能感兴趣的:(动态生成长条立方体)