在三角形网格JavaFX 8上创建面时遇到问题

时间:2014-03-20 13:25:47

标签: javafx-8

我正在尝试创建一个Toroid网格,但我无法正确创建面...  这是我的代码:

public static Group createToroidMesh(float radius, float tRadius, int tDivs, int rDivs) {
    final Group root = new Group();
    int numVerts = tDivs * rDivs;
    float[] points = new float[numVerts * POINT_SIZE],
            texCoords = new float[numVerts * TEXCOORD_SIZE];
    int[] faces = new int[numVerts * FACE_SIZE],
            smoothingGroups;

    int pointIndex = 0, texIndex = 0, faceIndex = 0, smoothIndex = 0;
    float tFrac = 1.0f / tDivs;
    float rFrac = 1.0f / rDivs;
    float x, y, z;

    int p0 = 0, p1 = 0, p2 = 0, p3 = 0, t0 = 0, t1 = 0, t2 = 0, t3 = 0;

    // create points
    for (int vertIndex = 0; vertIndex < tDivs; vertIndex++) {

        float radian = tFrac * vertIndex * 2.0f * 3.141592653589793f;

        for (int crossSectionIndex = 0; crossSectionIndex < rDivs; crossSectionIndex++) {

            float localRadian = rFrac * crossSectionIndex * 2.0f * 3.141592653589793f;

            points[pointIndex] = x = (radius + tRadius * ((float) Math.cos(radian))) * ((float) Math.cos(localRadian));
            points[pointIndex + 1] = y = (radius + tRadius * ((float) Math.cos(radian))) * ((float) Math.sin(localRadian));
            points[pointIndex + 2] = z = (tRadius * (float) Math.sin(radian));

            pointIndex += 3;

            float r = crossSectionIndex < tDivs ? tFrac * crossSectionIndex * 2.0F * 3.141592653589793f : 0.0f;
            texCoords[texIndex] = (0.5F + (float) (Math.sin(r) * 0.5D));;
            texCoords[texIndex + 1] = ((float) (Math.cos(r) * 0.5D) + 0.5F);

            texIndex += 2;

        }

    }

    //create faces
    for (int y1 = 0; y1 < tDivs - 1 ; y1++) {
        float radian = tFrac * y1 * 2.0f * 3.141592653589793f;
        for (int x1 = 0; x1 < rDivs - 1; x1++) {
            float localRadian = rFrac * x1 * 2.0f * 3.141592653589793f;
            p0 = y1 * rDivs + x1;
            p1 = p0 + 1;
            p2 = p0 + rDivs;
            p3 = p2 + 1;
            t0 = y1 * rDivs + x1;
            t1 = t0 + 1;
            t2 = t0 + rDivs;
            t3 = t1 + 1;

            try {
                faces[faceIndex] = (p2);
                faces[faceIndex + 1] = (t3);
                faces[faceIndex + 2] = (p0);
                faces[faceIndex + 3] = (t2);
                faces[faceIndex + 4] = (p1);
                faces[faceIndex + 5] = (t0);

                faceIndex += FACE_SIZE;

                faces[faceIndex] = (p2);
                faces[faceIndex + 1] = (t3);
                faces[faceIndex + 2] = (p1);
                faces[faceIndex + 3] = (t0);
                faces[faceIndex + 4] = (p3);
                faces[faceIndex + 5] = (t1);
                //faceIndex += FACE_SIZE;
            } catch (Exception e) {
                break;
            }
        }
    }
    TriangleMesh localTriangleMesh = new TriangleMesh();
    localTriangleMesh.getPoints().setAll(points);
    localTriangleMesh.getTexCoords().setAll(texCoords);
    localTriangleMesh.getFaces().setAll(faces);

    MeshView view = new MeshView(localTriangleMesh);
    view.setMaterial(new PhongMaterial(Color.BLUEVIOLET));
    view.setCullFace(CullFace.BACK);

    root.getChildren().clear();
    root.getChildren().add(view);
    //return localTriangleMesh;
    System.out.println("objs in group: " + root.getChildren().size()
            + ", \nnum of points in array: " + points.length / POINT_SIZE
            + ", \nnum TexCoords: " + texCoords.length / TEXCOORD_SIZE
            + ", \nface count: " + faces.length / FACE_SIZE);
    root.setRotationAxis(Rotate.X_AXIS);
    root.setRotate(90);
    return root;
}

结果如下: mesh rendered

有人可以帮助我更好地迭代这个吗?

我对网格的构造函数是:Group verts = MeshUtils.createToroidMesh(100,15,4,4);

1 个答案:

答案 0 :(得分:0)

好的,我想出了问题......问题出在我脸上。它是在点范围之外添加值,而texCoords,这是更正的循环:

//create faces        
    for (int point = 0; point < (tubeDivisions) ; point++) {
        for (int crossSection = 0; crossSection < (radiusDivisions) ; crossSection++) {
            p0 = point * radiusDivisions + crossSection;
            p1 = p0 >= 0 ? p0 + 1 : p0 - (radiusDivisions);
                p1 = p1 % (radiusDivisions) != 0 ? p0 + 1 : p0 - (radiusDivisions - 1);
            p2 = (p0 + radiusDivisions) < ((tubeDivisions * radiusDivisions)) ? p0 + radiusDivisions : p0 - (tubeDivisions * radiusDivisions) + radiusDivisions ;
            p3 = p2 < ((tubeDivisions * radiusDivisions) - 1) ? p2 + 1 : p2 - (tubeDivisions * radiusDivisions) + 1;
                p3 = p3 % (radiusDivisions) != 0 ? p2 + 1 : p2 - (radiusDivisions - 1); 

            t0 = point * (radiusDivisions) + crossSection;
            t1 = t0 >= 0 ? t0 + 1 : t0 - (radiusDivisions);
                t1 = t1 % (radiusDivisions) != 0 ? t0 + 1 : t0 - (radiusDivisions - 1);
            t2 = (t0 + radiusDivisions) < ((tubeDivisions * radiusDivisions)) ? t0 + radiusDivisions : t0 - (tubeDivisions * radiusDivisions) + radiusDivisions ;
            t3 = t2 < ((tubeDivisions * radiusDivisions) - 1) ? t2 + 1 : t2 - (tubeDivisions * radiusDivisions) + 1;
                t3 = t3 % (radiusDivisions) != 0 ? t2 + 1 : t2 - (radiusDivisions - 1);

            try {
                faces[faceIndex]     = (p2);
                faces[faceIndex + 1] = (t3);
                faces[faceIndex + 2] = (p0);
                faces[faceIndex + 3] = (t2);
                faces[faceIndex + 4] = (p1);
                faces[faceIndex + 5] = (t0);

                faceIndex += FACE_SIZE;

                faces[faceIndex]     = (p2);
                faces[faceIndex + 1] = (t3);
                faces[faceIndex + 2] = (p1);
                faces[faceIndex + 3] = (t0);
                faces[faceIndex + 4] = (p3);
                faces[faceIndex + 5] = (t1);
                faceIndex += FACE_SIZE;
            } catch (Exception e) {
                e.printStackTrace();
            }

            //System.out.println(" :: " +p0 + " : " + p1 + " : " + p2 + " : " + p3);

        }
    }

和结果:(方形圆环)enter image description here

(Round toroid)enter image description here

希望如果你也挣扎,这会有所帮助!

请注意我没有分配UV纹理(如果使用图像材质),因为只使用了Color。如果只使用颜色

,TexCoords可以是任何(0 - 1.0)
相关问题