2013-12-03 2 views
-2

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

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

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, если это поможет.

+0

Я не думаю, что код будет даже компиляции, вы имели в виду, чтобы иметь переменную «х» во внутреннем цикле, чтобы быть «г»? – ClickerMonkey

+0

Смотрите так: http://stackoverflow.com/questions/3485034/convert-triangle-strips-to-triangles?rq=1 – RazorProgrammer

+0

Смотрите так: http://stackoverflow.com/questions/3485034/преобразовать-треугольник-полоски к треугольники?rq = 1 Этот вопрос кажется похожим и может решить вашу проблему – RazorProgrammer

ответ

1

Предположим, что ваш код работает:

// 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 теперь все треугольники, оказываемые!

+0

Спасибо, это помогло мне разобраться в многом. –

1

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

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