Hi all,

I solved this by rolling my own geometry and dropping the use of
osg::Box. This function replaces the createCube function from the
previously posted code snippet.

I simply define my own color, vertex and normal buffer using Quad primitives.
Now the wireframe looks sane again.

static osg::Geode* createCube(float fRadius, osg::Vec3 vPosition,
osg::Vec4 color)
{
    osg::Geode* geode = new osg::Geode();
    osg::Geometry* cubeGeom = new osg::Geometry();

    osg::Vec4Array *colors = new osg::Vec4Array;
    colors->push_back(color);

    // define normals for each face
    osg::ref_ptr<osg::Vec3Array> cube_normals = new osg::Vec3Array;
    cube_normals->push_back(osg::Vec3( 0.0f,-1.0f, 0.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,-1.0f, 0.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,-1.0f, 0.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,-1.0f, 0.0f));

    cube_normals->push_back(osg::Vec3( 0.0f,+1.0f, 0.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+1.0f, 0.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+1.0f, 0.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+1.0f, 0.0f));

    cube_normals->push_back(osg::Vec3(+1.0f,+0.0f, 0.0f));
    cube_normals->push_back(osg::Vec3(+1.0f,+0.0f, 0.0f));
    cube_normals->push_back(osg::Vec3(+1.0f,+0.0f, 0.0f));
    cube_normals->push_back(osg::Vec3(+1.0f,+0.0f, 0.0f));

    cube_normals->push_back(osg::Vec3(-1.0f,+0.0f, 0.0f));
    cube_normals->push_back(osg::Vec3(-1.0f,+0.0f, 0.0f));
    cube_normals->push_back(osg::Vec3(-1.0f,+0.0f, 0.0f));
    cube_normals->push_back(osg::Vec3(-1.0f,+0.0f, 0.0f));

    cube_normals->push_back(osg::Vec3( 0.0f,+0.0f,-1.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+0.0f,-1.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+0.0f,-1.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+0.0f,-1.0f));

    cube_normals->push_back(osg::Vec3( 0.0f,+0.0f,+1.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+0.0f,+1.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+0.0f,+1.0f));
    cube_normals->push_back(osg::Vec3( 0.0f,+0.0f,+1.0f));

    vPosition += osg::Vec3(+fRadius/2, +fRadius/2, +fRadius/2);

    // note, counterclockwise winding order with respect to normals
    osg::Vec3 myCoords[] =
    {
        // bottom face
        osg::Vec3(-fRadius, -fRadius, -fRadius) + vPosition,
        osg::Vec3(+fRadius, -fRadius, -fRadius) + vPosition,
        osg::Vec3(+fRadius, -fRadius, +fRadius) + vPosition,
        osg::Vec3(-fRadius, -fRadius, +fRadius) + vPosition,

        // top face
        osg::Vec3(-fRadius, +fRadius, +fRadius) + vPosition,
        osg::Vec3(+fRadius, +fRadius, +fRadius) + vPosition,
        osg::Vec3(+fRadius, +fRadius, -fRadius) + vPosition,
        osg::Vec3(-fRadius, +fRadius, -fRadius) + vPosition,

        // right face
        osg::Vec3(+fRadius, -fRadius, -fRadius) + vPosition,
        osg::Vec3(+fRadius, +fRadius, -fRadius) + vPosition,
        osg::Vec3(+fRadius, +fRadius, +fRadius) + vPosition,
        osg::Vec3(+fRadius, -fRadius, +fRadius) + vPosition,

        // left face
        osg::Vec3(-fRadius, -fRadius, +fRadius) + vPosition,
        osg::Vec3(-fRadius, +fRadius, +fRadius) + vPosition,
        osg::Vec3(-fRadius, +fRadius, -fRadius) + vPosition,
        osg::Vec3(-fRadius, -fRadius, -fRadius) + vPosition,

        // front face
        osg::Vec3(-fRadius, +fRadius, -fRadius) + vPosition,
        osg::Vec3(+fRadius, +fRadius, -fRadius) + vPosition,
        osg::Vec3(+fRadius, -fRadius, -fRadius) + vPosition,
        osg::Vec3(-fRadius, -fRadius, -fRadius) + vPosition,

        // back face
        osg::Vec3(-fRadius, -fRadius, +fRadius) + vPosition,
        osg::Vec3(+fRadius, -fRadius, +fRadius) + vPosition,
        osg::Vec3(+fRadius, +fRadius, +fRadius) + vPosition,
        osg::Vec3(-fRadius, +fRadius, +fRadius) + vPosition
    };

    int numCoords = sizeof(myCoords)/sizeof(osg::Vec3);
    osg::Vec3Array* vertices = new osg::Vec3Array(numCoords,myCoords);
    cubeGeom->setVertexArray(vertices);

    cubeGeom->addPrimitiveSet(new
osg::DrawArrays(osg::PrimitiveSet::QUADS,0,numCoords));

    cubeGeom->setColorArray(colors);
    cubeGeom->setColorBinding(osg::Geometry::BIND_OVERALL);

    cubeGeom->setNormalArray(cube_normals.get());
    cubeGeom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);

    geode->addDrawable(cubeGeom);

    return geode;
}
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to