unity3d - 从点列表构建索引缓冲区
问题描述
我有一个二维空间中的点列表,我需要从它们构建一个顶点和索引缓冲区(我正在使用 Unity)。我不知道如何以正确的顺序处理这些点来做到这一点。
下面的星号是一个例子,我的输入保证是有效的,但在编译时是未知的。
mesh0 = new Mesh();
// vertices for a star shape
List<Vector3> vertices0 = new List<Vector3>();
List<int> triangles0 = new List<int>();
vertices0.Add(new Vector3(150, 0, 0));
vertices0.Add(new Vector3(121, -90, 0));
vertices0.Add(new Vector3(198, -35, 0));
vertices0.Add(new Vector3(102, -35, 0));
vertices0.Add(new Vector3(179, -90, 0));
// this bit is wrong
for(int i = 0; i < vertices0.Count - 1; i++) {
triangles0.Add(i);
triangles0.Add(i + 1);
triangles0.Add(i + 2);
}
mesh0.SetVertices(vertices);
mesh0.SetTriangles(triangles, 0);
在这种情况下,我希望三角形是[0, 1, 2, 2, 3, 4, 0, 4, 3]
呈现星形的有效索引缓冲区。谁能指出我正确的方向?
解决方案
你的三角形数组将是
0, 1, 2
1, 2, 3
2, 3, 4
3, 4, 5
5 让你失望,但你也只有 4 个三角形。
在这种情况下,您需要将三角形包裹起来
我建议将您的三角形生成重新格式化为:
for(int i = 0; i < vertices0.Count; i++)
{
triangles0.Add(i);
triangles0.Add((i + 1) % vertices0.Count);
triangles0.Add((i + 2) % vertices0.Count);
}
如果它们大于计数,则此处的模数运算符将“包裹”您的值。我还从顶点数中删除了 -1,因为您实际上并没有添加第 5 个三角形
尽管它制作了一个五边形,但它仍然没有制作星星,并输出以下三角形:
0,1,2
1,2,3
2,3,4
3,4,0
4,0,1
它也有很多重叠的三角形,但我相信你可以从这里改造它来做你想做的事
推荐阅读
- python - 如何使用 OpenCV 分割图像的灰色区域
- javascript - 嵌入消息 gif 不起作用 | 不和谐.js
- powershell - Powershell:如何获取当天登录一台计算机的所有用户?
- java - 无法使用自定义 Haar 级联分类器检测对象
- javascript - MongoDB 和 Node.js:检查电子邮件是否正在使用中
- powershell - 如何通过powershell将csv导入现有的SQL Server表
- sql - 为什么 COALESCE 在这里不返回 null ?
- gatling - Gatling 在模拟开始前写入 .csv 文件
- python - Python 中的网络爬虫:查找标签值
- php - Woocommerce 中特定运输类别、最低金额和特定国家/地区的免费送货购物车消息