Rounded Cube 1
上一章讲到Mesh的工作原理以及顶点与三角形的算法.本章主题如下:
- Create a cube with a seamless mesh. 创建无缝Mesh的立方体
- Add rounded edges to the cube. 添加圆形边缘的立方体
此为本人阅读笔记不作为转载处理,详细还请参看原文. 原文地址
Compositing a Cube 组合(方式)一个立方体
非重点,这里直接写实现思路.接上一章节生产面,只需修改每个面的角度位置.使其拼凑成为一个立方体即可.
Creating Cube Vertices 创建立方体的顶点
计算所需定点数量
之前计算单个面的时候使用 (#x + 1)(#y + 1)
如下算法,那么可计算6个面的时候是不是可以直接套用单面的计算方式:2((#x + 1)(#y + 1) + (#x + 1)(#z + 1) + (#y + 1)(#z + 1))
结论是否定的,其中角顶点与边顶点都被重复计算了。
这其实也不是什么大问题。事实上顶点重复是非常常见的,譬如我们通常用网格创建锐角。所以我们可以创建6个面(的顶点)合并到单个数组里。
但是这不是我们打算做的,因为我们已经知道如何创建网格。我们的cube不需要有重复的顶点,这种做法很有趣。
我们需要多少顶点呢?让我们按类型分解,首先8个角顶点,这很简单。有12条边,每四条在同向。因为我们不包括角,每个边都有一个等于相应大小的顶点减去一个顶点。或者,把它看作四组x、y和z边。
4(#x + #y + #z - 3)
其余的顶点是那些位于面部边缘的顶点。这是相当于一个重复的顶点,其体积缩小了2
2((#x - 1)(#y - 1) + (#x - 1)(#z - 1) + (#y - 1)(#z - 1))
这样计算出的结果就是最终所需顶点数
1 | private IEnumerator Generate () { |
现在定位一个面上的第一行顶点就像定位网格上的第一行顶点。(参考章节.1)
基础的算法是从x(0,0)开始,计算算一圈的点
1 | int v = 0; //索引 |
由以上基础我们可以直接绘制出第0层至顶层的点
1 | int v = 0; |
Add rounded edges to the cube. 添加圆形边缘的立方体
和上一章类似,我们这样绘制四边形
1 | private static int |
与顶点不同,三角形的数目等于六个面的总和。他们是否使用共享顶点并不重要。
1 | private void CreateTriangles () { |
创建横向的三角方式与创建网格的做法相同。至此为止位置不同的是顶点在下一行的偏移相当全部的环形顶点之和。
1 | private void CreateTriangles () { |
很不幸顶部与底部的面并不简单。顶点的布局就像是一个网格被环包围。
1 | private int CreateTopFace (int[] triangles, int t, int ring) { |
本文标题:Rounded Cube 1
文章作者:Keyle
发布时间:2017-11-20
最后更新:2017-11-24
原始链接:https://vrast.cn/posts/827b1a39/
版权声明:©Keyle's Blog. 本站采用署名-非商业性使用-相同方式共享 4.0 国际进行许可