如何计算多边形拆分三角面的顶点索引 以生成OpenGL元素缓冲区数据
存在可以适配任意边数正多边形的元素缓冲区数据计算方案,核心思路是利用凸多边形的三角化规则,以下是具体实现方案:
前置问题修正
你当前的顶点生成代码存在两处可优化点:
- 变量名笔误:定义的角度变量是
angle,但计算坐标时用的是未定义的ang,会导致编译报错 Math.round会导致生成的顶点不是严格的正多边形顶点,边缘顶点分布不均匀,如果不需要特殊近似效果可以去掉该方法
修正后的顶点生成代码如下:
public ArrayList<Float> generateVertices(int sides) { float centerAngle = (float) (2 * Math.PI / sides); ArrayList<Float> vertices = new ArrayList<>(); // 可选:如果用扇形三角化方案,可在此处先添加中心顶点(0,0,0) // vertices.add(0.0f); // vertices.add(0.0f); // vertices.add(0.0f); for (int i = 0; i < sides; i++) { float angle = i * centerAngle; float x = (float) Math.cos(angle) / 2f; float y = (float) Math.sin(angle) / 2f; float z = 0.0f; vertices.add(x); vertices.add(y); vertices.add(z); } return vertices; }
通用元素缓冲区生成方案
正多边形属于凸多边形,有两种成熟的三角化方案可以直接适配任意边数≥3的场景:
方案1:带中心顶点的扇形三角化(推荐)
逻辑最简单、性能最稳定,无适配问题
- 顶点生成阶段额外添加一个中心顶点
(0,0,0)放在顶点数组第0位,原来的边缘顶点依次后移到索引1~n的位置 - 索引生成逻辑:共n个三角形,每个三角形的索引规则为
[中心索引, 第i个边缘顶点, 第i+1个边缘顶点],最后一个三角形的尾顶点取第一个边缘顶点即可
对应代码实现:
public int[] generateIndicesWithCenter(int sides) { // n边型对应n个三角形,共3n个索引 int[] indices = new int[sides * 3]; int index = 0; for (int i = 1; i <= sides; i++) { indices[index++] = 0; // 固定中心顶点索引 indices[index++] = i; indices[index++] = (i == sides) ? 1 : i + 1; } return indices; }
方案2:无中心顶点的凸多边形三角化
适配你当前没有中心顶点的顶点结构
凸多边形三角化的固定规则:固定第0个顶点,依次拼接三角形[0, i, i+1],共生成n-2个三角形,符合凸多边形三角化的理论三角形数量。
对应代码实现:
public int[] generateIndicesWithoutCenter(int sides) { // n边型对应n-2个三角形,共3*(n-2)个索引 int[] indices = new int[(sides - 2) * 3]; int index = 0; for (int i = 1; i <= sides - 2; i++) { indices[index++] = 0; indices[index++] = i; indices[index++] = i + 1; } return indices; }
内容的提问来源于stack exchange,提问作者Israel Aristide
相关产品推荐
相关产品推荐

