我目前正在模拟布料等材料,然后通过“打开场景图”显示结果。 通过将所有顶点转储到1个Vec3Array中,然后使用基于Point的标准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
...
以前有没有人遇到过这个特定用例,他/她是否可以解决我的问题?任何帮助将不胜感激。
答案 0 :(得分:0)
您可能想研究将DrawArrays与QUAD_STRIP(或TRIANGLE_STRIP)一起使用,因为这些天四边形不受欢迎。这里有一个例子: http://openscenegraph.sourceforge.net/documentation/OpenSceneGraph/examples/osggeometry/osggeometry.cpp
它的效率略低于Elements / indices,但管理两个相关容器(顶点和索引)之间的关系也较简单。
如果您真的想执行Elements / indices路线,我们可能需要查看更多repro代码以了解发生的情况。