Если вы хотите получить треугольную полоску для ведьмы, у вас есть каждая вершина в массиве, вы должны сначала создать массив из вершин.
Стандартный прямоугольник формы генерации сетки выглядит следующим образом: (его в C++, но и использовать его в качестве псевдокода)
for(int x=0; x<sizex; x+=stepsize)
{
for(int y=0; y<sizey; y+=stepsize)
{
vertexarray.push_back(vec3(x,y,z)); //for a plane set z to any const.
}
}
, то вы можете создать массив индексов для этого:
for(int x=0; x<sizex-1; x+=stepsize)
{
for(int y=0; y<sizey-1; y+=stepsize)
{
indexarray.push_back(y*sizex+x);
indexarray.push_back(y*sizex+x+1);
indexarray.push_back((y+1)*sizex+x); //first triangle in the strip
indexarray.push_back((y+1)*sizex+x);
indexarray.push_back(y*sizex+x+1);
indexarray.push_back((y+1)*sizex+x+1); //second triangle
}
}
затем размер массива индексной
GLint count = 6(sizex-1)(sizey-1);
и рендер позвоню можно использовать VAOs РВО, или в ПКО:
//the following is your code
GL11.glBegin(GL11.GL_TRIANGLE_STRIP);
for (int i = 0; i< count i++)
{
GL11.glVertex3f(vertexarray[indexarray[i]].x, vertexarray[indexarray[i]].y, vertexarray[indexarray[i]].z);
}
GL11.glEnd();
для нормалей поверхности вы можете легко получить точки треугольника, перебор вершин, получить их сосед и расчет кросса продуктов не так уж трудно. Вы также можете легко извлечь треугольники из массива индексов.
int i = 0, t = 0;
for(int x=0; x<sizex-1; x+=stepsize)
{
for(int y=0; y<sizey-1; y+=stepsize)
{
indexarray.push_back(y*sizex+x);
indexarray.push_back(y*sizex+x+1);
indexarray.push_back((y+1)*sizex+x); //first triangle in the strip
indexarray.push_back((y+1)*sizex+x);
indexarray.push_back(y*sizex+x+1);
indexarray.push_back((y+1)*sizex+x+1); //second triangle
triangles[t].vertex1.xyz = vertexarray[indexarray[i]].xyz;
triangles[t].vertex2.xyz = vertexarray[indexarray[i+1]].xyz;
triangles[t].vertex3.xyz = vertexarray[indexarray[i+2]].xyz;
triangles[t+1].vertex1.xyz = vertexarray[indexarray[i+3]].xyz;
triangles[t+1].vertex2.xyz = vertexarray[indexarray[i+4]].xyz;
triangles[t+1].vertex3.xyz = vertexarray[indexarray[i+5]].xyz;
t+=2; //you made 2 triangles
i+=6; //passed over 6 indeces that make up the 2 triangles
}
}
EDIT: структура треугольника:
struct TRIANGLE{
vec3 vertex1, vertex2,... //or vertex[3]; to declare it as an array too
};
struct vec3{
int x, y, z;
//float f_x,f_y,f_z;
vec3(int X; int Y; in Z):x(X),y(Y),z(Z){};
~vec3(){};
};
вершины или индексов массива может быть список или любой контейнер. Я предпочитаю вектор в C++.
Размер массива треугольника:
TRIANGLE* triangles = new TRIANGLES[count/3];
//3 vertices for a triangle, same as (sizex-1)*(sizey-1)*2 for 2
//triangles for every quad that makes up the mesh, and it has (sizex-1)(sizey-1) quads
Я не думаю, что код будет даже компиляции, вы имели в виду, чтобы иметь переменную «х» во внутреннем цикле, чтобы быть «г»? – ClickerMonkey
Смотрите так: http://stackoverflow.com/questions/3485034/convert-triangle-strips-to-triangles?rq=1 – RazorProgrammer
Смотрите так: http://stackoverflow.com/questions/3485034/преобразовать-треугольник-полоски к треугольники?rq = 1 Этот вопрос кажется похожим и может решить вашу проблему – RazorProgrammer