得到三角形带内的三角形?

Posted

技术标签:

【中文标题】得到三角形带内的三角形?【英文标题】:Getting the triangles within a tringle strip? 【发布时间】:2013-12-03 18:52:33 【问题描述】:

我在查找构成给定 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();

另外,如果有帮助的话,我正在 java 中使用 lwjgl。

【问题讨论】:

我认为代码甚至都不会编译,您的意思是让内部循环中的变量“x”成为“z”吗? 参考这个:***.com/questions/3485034/… 参考这个:***.com/questions/3485034/… 这个问题看起来很相似,可能会解决你的问题 是的对不起,我把它作为一个简化版本,因为我改变了好几次,我从来没有遵守它。我现在将外部循环更改为浮动 z。 【参考方案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 现在已经渲染了所有三角形!

【讨论】:

谢谢你,这对我有很大帮助。【参考方案2】:

如果你想得到一个三角形条带你有一个数组中的每个顶点,你应该首先制作一个顶点数组。

标准的矩形网格生成看起来像这样:(它在 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 VBOs,或在 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

【讨论】:

以上是关于得到三角形带内的三角形?的主要内容,如果未能解决你的问题,请参考以下文章

光栅化阶段:三角形设置、三角形遍历、像素着色、合并

BZOJ1258 [CQOI2007]三角形

三角形个数的计算

圆内三角形统计

百度--寻找三角形

CSS三角形绘制