Как добавить две треугольные сетки вместе в javafx?

Я делаю 3D-модель объема, созданную двумя функциями: одна как основание (в пересечении оси X), а другая как высота объема. Это достигается путем аппроксимации объема мелких деталей, рисования эту сетку, а затем сложить все сетки вместе. Однако я не могу понять, как добавить сетки вместе.

Вот мой создатель сетки:

 private TriangleMesh createVolume(double start, double end, double numSteps, PolynomialFunction base, PolynomialFunction height) {
    TriangleMesh m = new TriangleMesh();

    double stepSize = (end-start)/numSteps;

    for(double i = start; i < end; i += stepSize) {

        double x = i;
        double x2 = x+stepSize;
        double gx = height.value(x);
        double gx2 = height.value(x2);
        double fx = base.value(x);
        double fx2 = base.value(x2);


        TriangleMesh t = createVolumeSection(x,x2,gx,gx2,fx,fx2);
        m.getPoints().addAll(t.getPoints());
        m.getTexCoords().addAll(t.getTexCoords());
        m.getFaces().addAll(t.getFaces());
    }

    return m;
}


private TriangleMesh createVolumeSection(double xVal, double x2Val, double gxVal, double gx2Val,
                                         double fxVal, double fx2Val){
    TriangleMesh m = new TriangleMesh();
    float x = ((float)xVal) ;
    float x2 = ((float)x2Val);
    float gx = ((float)gxVal);
    float gx2 = ((float)gx2Val);
    float fx = ((float)fxVal);
    float fx2 = ((float)fx2Val);

    //create Points
    m.getPoints().addAll(
            x,  0,  0,      // A = 0
            x,  0,  gx,     // B = 1
            x2, 0,  0,      // C = 2
            x2, 0,  gx2,    // D = 3
            x,  fx, 0,      // E = 4
            x,  fx, gx,     // F = 5
            x2, fx2,0,      // G = 6
            x2, fx2,gx2     // H = 7
    );

    m.getTexCoords().addAll(0,0);

    m.getFaces().addAll(
            0 , 0 , 1 , 0 , 3 , 0 ,     // A-B-D
            0 , 0 , 3 , 0 , 2 , 0 ,     // A-D-C
            0 , 0 , 2 , 0 , 6 , 0 ,     // A-C-G
            0 , 0 , 6 , 0 , 4 , 0 ,     // A-G-E
            0 , 0 , 4 , 0 , 1 , 0 ,     // A-E-B
            1 , 0 , 4 , 0 , 5 , 0 ,     // B-E-F
            1 , 0 , 5 , 0 , 7 , 0 ,     // B-F-H
            1 , 0 , 7 , 0 , 3 , 0 ,     // B-H-D
            3 , 0 , 7 , 0 , 6 , 0 ,     // D-H-G
            3 , 0 , 6 , 0 , 2 , 0 ,     // D-G-C
            6 , 0 , 7 , 0 , 5 , 0 ,     // G-H-F
            6 , 0 , 5 , 0 , 4 , 0       // G-F-E
    );

    return m ;
}

Предполагается, что это создаст ряд прямоугольных трапециевидных призм, но в итоге рисуется только первая сетка в ряду.

Кто-нибудь может помочь?

Заранее спасибо.


person thblackhelmetman    schedule 19.05.2015    source источник
comment
Можете ли вы предоставить полиномиальные функции, которые вы используете? (Нет времени выяснять разумные возвращаемые значения для них...)   -  person Marco13    schedule 19.05.2015
comment
@Marco13 Marco13 моя тестовая функция x^2   -  person thblackhelmetman    schedule 19.05.2015


Ответы (1)


Ваш подход почти правильный, но вы не можете обновить информацию о массиве лиц.

С каждым добавляемым разделом объема вы добавляете новые вершины в итоговую сетку, поэтому индексы вершин в массиве граней должны быть соответствующим образом сдвинуты. Для этого ведите счетчик общего количества баллов, начисленных за n-1 томов:

private int points=0;

private TriangleMesh createVolume(double start, double end, double numSteps, Function<Number,Number> base, Function<Number,Number> height) {
    ...
    TriangleMesh t = createVolumeSection(x,x2,gx,gx2,fx,fx2);
    m.getPoints().addAll(t.getPoints());
    points=m.getPoints().size()/3;
    ...
}

а затем измените массив лиц:

private TriangleMesh createVolumeSection(double xVal, double x2Val, double gxVal, double gx2Val,
                                         double fxVal, double fx2Val){
    TriangleMesh m = new TriangleMesh();
    ...
    m.getFaces().addAll(
            points+0 , 0 , points+1 , 0 , points+3 , 0 ,     // A-B-D
            points+0 , 0 , points+3 , 0 , points+2 , 0 ,     // A-D-C
            points+0 , 0 , points+2 , 0 , points+6 , 0 ,     // A-C-G
            points+0 , 0 , points+6 , 0 , points+4 , 0 ,     // A-G-E
            points+0 , 0 , points+4 , 0 , points+1 , 0 ,     // A-E-B
            points+1 , 0 , points+4 , 0 , points+5 , 0 ,     // B-E-F
            points+1 , 0 , points+5 , 0 , points+7 , 0 ,     // B-F-H
            points+1 , 0 , points+7 , 0 , points+3 , 0 ,     // B-H-D
            points+3 , 0 , points+7 , 0 , points+6 , 0 ,     // D-H-G
            points+3 , 0 , points+6 , 0 , points+2 , 0 ,     // D-G-C
            points+6 , 0 , points+7 , 0 , points+5 , 0 ,     // G-H-F
            points+6 , 0 , points+5 , 0 , points+4 , 0       // G-F-E
    );

    return m ;
}
person José Pereda    schedule 19.05.2015
comment
Я попробовал это, и при запуске он выдает мне предупреждение о том, что значения в массиве лиц должны быть в диапазоне (от 0 до points.length/3-1). Сетка вообще не рисуется. - person thblackhelmetman; 20.05.2015
comment
Я успешно протестировал его: TriangleMesh createVolume = createVolume(0, 10, 10, x->Math.sin(x.doubleValue()), x->Math.cos(x.doubleValue())); group.getChildren().addAll(new MeshView(createVolume)); - person José Pereda; 20.05.2015
comment
Можно ли сделать так, чтобы точки имели дополнительные индексы, чтобы предупреждение не появлялось, а затем добавить точки из определенного индекса. - person thblackhelmetman; 20.05.2015
comment
Или мне убрать вспомогательный метод и перевести код в метод с циклом? Это сделало бы так, чтобы весь массив точек обновлялся, поэтому индексы граней также обновлялись бы одновременно. - person thblackhelmetman; 20.05.2015
comment
Неважно, я понял, что мне нужно сбрасывать точки на 0 каждый раз, когда вызывается метод. Дох. Большое спасибо за вашу помощь. - person thblackhelmetman; 20.05.2015