在3D对象的外部找到三角形

时间:2016-08-26 03:03:17

标签: java android opengl-es 3d

我正在尝试获取一组顶点(vi = xi,yi,zi)并从中创建一个实体对象。为了绘制对象,我使用三角形,所以我需要找到一组三角形t = v1,v2,v3,它们形成一个固体表面。

我知道如果我从顶点构造每个可能的三角形,我会看到一个坚固的表面,但这会浪费在隐藏在对象内部的三角形上的大量资源,并计算它们的所有成本O(N ^ 3)其中N是顶点数。如何仅在外部找到三角形?

enter image description here

这是我的代码(java),用于生成具有随机顶点的对象中的所有三角形。

public class myObject {

    public ArrayList<float[]> Vertex_Coords;
    ArrayList<float[]> Vertex_Colors;
    ArrayList<int[]> triangles;


    public myObject() {

        Vertex_Colors = new ArrayList<float[]>();
        Vertex_Coords = new ArrayList<float[]>();
        triangles = new ArrayList<int[]>();

        addball(20);
    }

    public void addvertex() {
        float[] coords = new float[3];
        float[] colors = new float[4];
        int i;

        for (i = 0; i < 3; i++)
            coords[i] = maxModelSize * ((float) Math.random()-0.5f);

        for (i = 0; i < 4; i++)
            colors[i] =  (float) Math.random();

        Vertex_Coords.add(coords);
        Vertex_Colors.add(colors);
    }

    public void addball(int numpoints)
    {
        int i;
        for(i = 0;i<numpoints;i++)
        {
            addvertex(false,true);
        }
        connectalltriangles();
    }

    public void connectalltriangles()
    {
        int i,j,k;
        int [] tri;
        for(i=0;i<Vertex_Coords.size();i++)
        for(j=i+1;j<Vertex_Coords.size();j++)
            for(k=j+1;k<Vertex_Coords.size();k++)
        {
            tri = new int[3];
            tri[0]=i;
            tri[1]=j;
            tri[2]=k;
            triangles.add(tri);
        }
    }

}

1 个答案:

答案 0 :(得分:1)

如果您确定几何体是否始终是凸的,那么您真正需要的是凸壳算法。

Convex Hull:此算法通过仅连接3d空间中给定点集的最外侧顶点来创建网格。显然,您将松开凸结构内部的顶点,不会在任何三角形中使用。这仅适用于凸形。

以下是凸壳结构的一个很好的例子。

Convex Hull

有许多库实现了Convex脱壳算法。例如:CGAL,BulletPhysics和OpenMesh。如果您正在寻找快速建造凸壳的方法,QuickHull是最好的选择。 http://www.qhull.org