java - 查找 3D 对象外部的三角形

标签 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);
        }
    }

}

最佳答案

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

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

下面是凸包结构的一个很好的例子。

Convex Hull

有许多库实现凸包算法。例如:CGAL、BulletPhysics 和 OpenMesh。如果您正在寻找一种快速构建凸包的方法,QuickHull 是最好的地方。 http://www.qhull.org

关于java - 查找 3D 对象外部的三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39157705/

相关文章:

Java wordsearch方法,搜索给定的二维数组

android - 将顶点缓冲区转换为顶点数组

Android - 使用 NDK 的 OpenGL ES 2.0 教程?

java - 两个类之间的关系(德国代码)

java - 从不同服务器 Google App Engine 读取文件

java - "architecture-neutral"和 "portable"有什么区别?

android - Toast 文本不适合(溢出)

java - GridView 将最后一个项目显示为一半项目,有些经常不展开

android - imageView 在 recyclerview viewholder 中为 null

graphics - 正确的缩放和旋转转换设置