我当前正在努力模拟材料之类的布,然后通过开放场景图显示结果。通过将所有顶点倒入1个VEC3Array,然后以标准的基于标准的绘制仪表显示它们,我已经获得了展示一些布的设置。但是,我正在考虑在顶点之间添加面孔,以便我的应用程序的另一部分可以视觉上看到布。
这是我目前正在尝试的pripitiveset
// 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
...
以前有人遇到过这个特定的用例,他/她是否有解决我的问题的解决方案?任何帮助将不胜感激。
您可能想考虑使用quad_strip(或triangle_strip)使用drawarrays,因为这几天Quads皱眉了)。这里有一个例子:http://openscenegraph.sourceforge.net/documentation/openscenegraph/examples/osggeomplerry/osggeometry/osggeometry.cpp
它的效率略低于元素/索引,但是管理两个相关容器之间的关系(顶点和指数)也不那么复杂。
如果您真的想做元素/索引路由,我们可能需要查看更多的repro代码才能查看发生了什么。