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
Это немного менее эффективно, чем элементы / индексы, но также менее сложно управлять отношениями между двумя связанными контейнерами (вершинами и индексами).
Если вы действительно хотите выполнить маршрут по элементам / индексам, нам, вероятно, нужно увидеть больше кода репро, чтобы увидеть, что происходит.