如何制作正方体(动态生成长条立方体)
## 背景
最近有一个需求, 根据一条线(实际是一系列的点集)生成一个长方体, 也就是本来显示线,就很简单了, 现在不要显示为线, 而是要显示为长条形的线, 也就是一个长的立方体, 这个立方体是可以任意弯曲, 有任意的形状.
## 过程
解决过程很曲折, 所以我想写下来,记念一下.
### Try
我第一次是在每个点上做向外扩展四个点, 这四个点就是原始点 x,y 加减 w/2, h/2, 然后再把这些点组织成三角形.
结果:
在 x, y 往外扩其实只有在线是在 z 方向上, 才可以,要是线在 x 方向, 明显就不行了
### Try Try
吸取了上一次的教训, 我意识到, 点向外扩没有问题, 这个外扩其实是在原始点所在的平面来做的, 而这个平面与点所在的坐标系基本不会是一致的.
那么这个平面上的四个点, 应该怎么确定呢, 我找到以下几个已知条件,等式
平面与法线垂直, 所以 PN = 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 的顶点位置了.
这里有对应的实现
github/hugohuang1111/ufxcase/blob/master/Assets/Scripts/DynamicLongCube.cs#L217
## 方案
具体的实现可以看这里, 其中对于三角形面的处理也有介绍
github/hugohuang1111/ufxcase/blob/master/Assets/Scripts/DynamicLongCube.cs
nba赛程
- 哈登10分篮网战胜热火 哈登篮网比赛集锦
- nba快船vs步行者 nba快船vs步行者全场回放
- 湖人对阵鹈鹕:湖人对阵鹈鹕回放
- 中国男篮蓝队:中国男篮蓝队热身赛
- nba半兽人法里埃德 nba半兽人法里埃德身高
- 约翰沃尔百米速度 约翰沃尔生涯最高分
- 东契奇砍下40分篮网加时纪录 东契奇砍下40分篮网
- 詹姆斯年薪多少钱 詹姆斯最高年薪是多少
- 公牛vs热火东部决赛 公牛vs热火东部决赛回放
- 勇士退役35号球衣 勇士退役球衣一览表
- 快船vs灰熊季后赛 快船vs灰熊季后赛第六场
- 詹姆斯乔治湖人球衣 詹姆斯湖人球衣有几款
- 易立致歉易建联:易建联事件是怎么回事
- 广东27连胜创cba历史纪录 cba广东队的连胜纪录
- 女篮获得奥运资格 女篮获得奥运资格了吗
- 火箭vs鹈鹕全场录像回放 火箭vs鹈鹕比赛录像