[osg-users] Drawing a textured cube

Florian GOLESTIN florian.golestin at gmail.com
Fri Apr 8 13:32:02 PDT 2016


Hi everyone,

I'm learning OSG with the quick start guide and the example but I'm struggling drawing a textured cube. The shape is correct but only 4 faces are textured on 6.


Below is the shape:


Code:

osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(8);

(*vertices)[0].set( 0.0f, 0.0f, 0.0f);
(*vertices)[1].set( 1.0f, 0.0f, 0.0f);
(*vertices)[2].set( 1.0f, 0.0f, 1.0f);
(*vertices)[3].set( 0.0f, 0.0f, 1.0f);
(*vertices)[4].set( 0.0f, 1.0f, 1.0f);
(*vertices)[5].set( 1.0f, 1.0f, 1.0f);
(*vertices)[6].set( 1.0f, 1.0f, 0.0f);
(*vertices)[7].set( 0.0f, 1.0f, 0.0f);



osg::ref_ptr<osg::DrawElementsUInt> indices = new osg::DrawElementsUInt(GL_TRIANGLES);
// Front
indices->push_back( 0 ); indices->push_back( 1 ); indices->push_back( 2 );
indices->push_back( 3 ); indices->push_back( 0 ); indices->push_back( 2 );
// Top
indices->push_back( 3 ); indices->push_back( 4 ); indices->push_back( 2 );
indices->push_back( 4 ); indices->push_back( 5 ); indices->push_back( 2 );
// Back
indices->push_back( 6 ); indices->push_back( 7 ); indices->push_back( 5 );
indices->push_back( 4 ); indices->push_back( 7 ); indices->push_back( 5 );
// left ---
indices->push_back( 7 ); indices->push_back( 3 ); indices->push_back( 4 );
indices->push_back( 0 ); indices->push_back( 7 ); indices->push_back( 3 );
// right
indices->push_back( 2 ); indices->push_back( 5 ); indices->push_back( 6 );
indices->push_back( 1 ); indices->push_back( 2 ); indices->push_back( 6 );
// Bottom
indices->push_back( 0 ); indices->push_back( 7 ); indices->push_back( 1 );
indices->push_back( 1 ); indices->push_back( 6 ); indices->push_back( 7 );


osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
geom->setVertexArray(vertices);
geom->addPrimitiveSet(indices);
osgUtil::SmoothingVisitor::smooth(*geom);




I've a first question here: Do the indice order has an importance?

For instance first line could also be:

Code:
indices->push_back( 2 ); indices->push_back( 1 ); indices->push_back( 0 );




Then the texture:


Code:

osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array(16);
(*texcoords)[0].set( osg::Vec2(0.0f, 0.0f) );
(*texcoords)[1].set( osg::Vec2(0.0f, 1.0f) );
(*texcoords)[2].set( osg::Vec2(1.0f, 1.0f) );
(*texcoords)[3].set( osg::Vec2(1.0f, 0.0f) );
//
(*texcoords)[4].set( osg::Vec2(0.0f, 0.0f) );
(*texcoords)[5].set( osg::Vec2(0.0f, 1.0f) );
(*texcoords)[6].set( osg::Vec2(1.0f, 1.0f) );
(*texcoords)[7].set( osg::Vec2(1.0f, 0.0f) );

geom->setTexCoordArray(0, texcoords.get());

osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
osg::ref_ptr<osg::Image> image = osgDB::readImageFile("stone_3_2048x2048.jpg");
texture->setImage(image);
texture->setUnRefImageDataAfterApply(true);
texture->setDataVariance(osg::Object::DYNAMIC);

node->addDrawable(geom);
node->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture);





Here I'm not sure to understand the 'textcoords' array. At the beginning I thought it was the location on the image, but with only 4 parameters, the cube was textured on the front and half of the top face.
Doubling the texture brought texture on 4 (front, top, back, bottom) 6 faces .



Do you have any suggestion or documentation I can look for?


Thank you!

Cheers,
Florian[/img]

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=66771#66771




Attachments: 
http://forum.openscenegraph.org//files/screenshot_from_2016_04_08_22_21_22_108.png





More information about the osg-users mailing list