Sorry about the confusion. Here is the openGL code that works:
*triangle t;*
* const float* pFltArrayN = t.getNormal();*
* const float* pFltArray1 = t.getVert1();*
* const float* pFltArray2 = t.getVert2();*
* const float* pFltArray3 = t.getVert3();*
* glNormal3fv(pFltArrayN);*
* glVertex3fv(pFltArray1);*
* glVertex3fv(pFltArray2);*
* glVertex3fv(pFltArray3);*
* *
* a[0] = -pFltArrayN[0];*
* a[1] = -pFltArrayN[1];*
* a[2] = -pFltArrayN[2];*
* glNormal3fv(a);*
* glVertex3fv(pFltArray3);*
* glVertex3fv(pFltArray2);*
* glVertex3fv(pFltArray1);*
I tried to do the same thing in osg, here is my code:
*osg::ref_ptr<osg::Material> material = new osg::Material();
material->setEmission(osg::Material::FRONT_AND_BACK,osg::Vec4f(0.00f,0.00f,0.00f,0.00f));
osg::ref_ptr<osg::PolygonMode> polymode = new osg::PolygonMode();
polymode->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::FILL);
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();
stateset->setAttributeAndModes(material.get(),osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
stateset->setAttributeAndModes(polymode.get(),osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
stateset->setTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OVERRIDE|osg::StateAttribute::OFF);
*
*for(int j = 0; j < mesh->getNumTriangles(); j ++)*
*{*
* osg::DrawElementsUInt* frontTriElement = new
osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES,0);*
* frontTriElement->push_back(mesh->getTri(j).getVert1Index());*
* frontTriElement->push_back(mesh->getTri(j).getVert2Index());*
* frontTriElement->push_back(mesh->getTri(j).getVert3Index());*
* meshGeometry->addPrimitiveSet(frontTriElement);*
* osg::Vec3f normalVec(mesh->getTri(j).getNormalVec3().x,
mesh->getTri(j).getNormalVec3().y,*
*
mesh->getTri(j).getNormalVec3().z);*
* normalArray->push_back(normalVec);*
* osg::DrawElementsUInt* backTriElement = new
osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES,0);*
* backTriElement->push_back(mesh->getTri(j).getVert3Index());*
* backTriElement->push_back(mesh->getTri(j).getVert2Index());*
* backTriElement->push_back(mesh->getTri(j).getVert1Index());*
* meshGeometry->addPrimitiveSet(backTriElement);*
* normalArray->push_back(-normalVec);*
*}*
*meshGeometry->setStateSet(stateset.get());*
*meshGeometry->setVertexArray(vertexArray.get());*
*meshGeometry->setNormalArray(normalArray.get());*
*meshGeometry->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE);*
While seems this doesn't work. Any problem or mistake? Thanks a lot!
Ruqin
2009/3/18 Robert Osfield <[email protected]>
> Hi Ruqin,
>
> 2009/3/18 Ruqin Zhang <[email protected]>
>
>> Thanks Robert. Alright, here is the deal. I'm trying to draw a 3D
>> triangular mesh with osg. For some mesh, the calculated normal points
>> to the inside. So, I want to draw both the front and back faces, which
>> have opposite normals. Then you can render the mesh visible.
>> Is there an example of this? Thanks!
>>
>
> Are you talking about two face lighting of back face culling here??
> Originally your email sounded like you were talking about lighting at back
> face culling has nothing to do with normals, but this new emails sounds like
> you might be refering to back face culling...
>
> Robert.
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org