Получать треугольники внутри полоски?

У меня возникли проблемы с поиском вершин, которые составляют все треугольники в данной полосе треугольника opengl. Мне было интересно, может ли кто-нибудь помочь с подходами к этому с помощью некоторого псевдокода или примеров.

Вот пример того, как я рисую каждую вершину. Я знаю, что мне нужно назначить каждую вершину треугольному объекту, который содержит локальные переменные point1, point2 и point3. Эти три переменные являются векторным объектом, каждый из которых имеет x, y и z. Но моя проблема всегда заканчивается тем, где я создаю объект треугольника, когда я, очевидно, не должен создавать одну каждую итерацию цикла for? Кроме того, причина, по которой мне нужно знать точки каждого треугольника, заключается в том, что я вычисляю нормали поверхности.

GL11.glBegin(GL11.GL_TRIANGLE_STRIP);
     for (float z=0.0f; z<=20.0f; z+=2.0f) {
          for (float x=0.0f; x<=20.0f; x+=2.0f) {

               GL11.glVertex3f(x, 0.0f, z); 
          }
     }

GL11.glEnd();

Кроме того, я использую lwjgl в Java, если это поможет.

2 ответа

Решение

Предполагая, что ваш код работает:

 // Triangle Class
 public class Triangle {  
      public Point points[] = {new Point(), new Point(), new Point()};
 }

 Triangle currentTriangle = new Triangle();
 int trianglePointIndex = 0;
 List<Triangle> triangleList = new ArrayList<Triangle>();
 GL11.glBegin(GL11.GL_TRIANGLE_STRIP);
 for (float z=0.0f; z<=20.0f; z+=2.0f) {
      for (float x=0.0f; x<=20.0f; x+=2.0f) {
           GL11.glVertex3f(x, 0.0f, z); 

           Point currentPoint = currentTriangle.points[ trianglePointIndex ];
           currentPoint.x = x;
           currentPoint.y = 0.0f;
           currentPoint.z = z;

           trianglePointIndex++;

           if (trianglePointIndex == 3) {
                triangleList.add( currentTriangle );
                Triangle nextTriangle = new Triangle();
                nextTriangle.points[0].set( currentTriangle.points[1] );
                nextTriangle.points[1].set( currentTriangle.points[2] );
                currentTriangle = nextTriangle;
                trianglePointIndex = 2;
           }
      }
 }
 GL11.glEnd();

В triangleList теперь отображаются все треугольники!

Если вы хотите получить треугольную полосу для каждой вершины в массиве, вы должны сначала создать массив вершин.

Стандартная генерация сетки в форме прямоугольника выглядит следующим образом:(она в 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);

и в вызове рендеринга вы можете использовать VAO VAO или в FFP:

//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
}
}

РЕДАКТИРОВАТЬ: структура треугольника:

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
Другие вопросы по тегам