Open Scene Graph - Использование DrawElementsUInt: рисование ткани без дублирования вершин

В настоящее время я работаю над моделированием материала, подобного ткани, и затем отображаю результаты с помощью Open Scene Graph. Я получил настройку для отображения чего-то похожего на ткань, просто сбросив все вершины в 1 Vec3Array и затем отобразив их с помощью стандартного DrawArrays на основе точек. Однако я собираюсь добавить грани между вершинами, чтобы дальнейшая часть моего приложения могла визуально видеть ткань.

Это то, что я сейчас пытаюсь сделать с PrimitiveSet.

    // create and add a DrawArray Primitive (see include/osg/Primitive).  The first
    // parameter passed to the DrawArrays constructor is the Primitive::Mode which
    // in this case is POINTS (which has the same value GL_POINTS), the second
    // parameter is the index position into the vertex array of the first point
    // to draw, and the third parameter is the number of points to draw.
    unsigned int k = CLOTH_SIZE_X;
    unsigned int n = CLOTH_SIZE_Y;
    osg::ref_ptr<osg::DrawElementsUInt> indices = new osg::DrawElementsUInt(GL_QUADS, (k) * (n));
    for (uint y_i = 0; y_i < n - 1; y_i++) {
        for (uint x_i = 0; x_i < k - 1; x_i++) {
            (*indices)[y_i * k + x_i] = y_i * k + x_i;
            (*indices)[y_i * (k + 1) + x_i] = y_i * (k + 1) + x_i;
            (*indices)[y_i * (k + 1) + x_i + 1] = y_i * (k + 1) + x_i + 1;
            (*indices)[y_i * k + x_i] = y_i * k + x_i + 1;
        }
    }

    geom->addPrimitiveSet(indices.get());

Это, однако, приводит к повреждению памяти во время работы, и я недостаточно хорошо разбираюсь в коде на ассемблере, чтобы понять, что он пытается сделать неправильно, когда CLion дает мне дизассемблированный код.

Я думал, что я буду перебирать каждую грань своей ткани, а затем выбираю 4 индекса вершин, которые ей принадлежат. Вершины вводятся сверху вниз по порядку справа налево. Так:

0  1    2    3    ... k-1
k  k+1  k+2  k+3  ... 2k-1
2k 2k+1 2k+2 2k+3 ... 3k-1 
...

Кто-нибудь сталкивался с этим конкретным вариантом использования раньше, и, возможно, у него / нее есть решение моей проблемы? Любая помощь будет принята с благодарностью.

1 ответ

Возможно, вы захотите изучить использование DrawArrays с QUAD_STRIP (или TRIANGLE_STRIP, потому что в наши дни квады недовольны). Вот пример: http://openscenegraph.sourceforge.net/documentation/OpenSceneGraph/examples/osggeometry/osggeometry.cpp

Это немного менее эффективно, чем элементы / индексы, но также менее сложно управлять отношениями между двумя связанными контейнерами (вершинами и индексами).

Если вы действительно хотите выполнить маршрут по элементам / индексам, нам, вероятно, нужно увидеть больше кода репро, чтобы увидеть, что происходит.

Другие вопросы по тегам