![]() |
【转帖】vecotrizing 3d Solids Part 2
vecotrizing 3d solids part 2
vecotrizing 3d solids part 2 hello all, is there any reason why this post below was not answered, is it extremely simple that i am missing something (which is probably very likely :-) ) ? and once again thanx in advance whoever helps me. cheers jason =================================== i am trying to vectorize a 3dsolid, but i never get shell information/face/mesh, however all 2d line/polyline vectorization is correct. i notice that the m_rendermode is optimized 2d, but even if i change this, it still only produces outlines. my code is a follows : header ------------ class vectorizer : public odgigeometrysimplifier, public odgsbasevectorizeview { public: vectorizer() { //setfilltype(kodgifillalways); odgigeometrysimplifier::m_rendermode = kgouraudshadedwithwireframe; odgsbasevectorizeview::m_rendermode = kgouraudshadedwithwireframe; }; virtual void polylineout(odint32 n, const odgepoint3d* pts); virtual void polygonout(odint32 nbpoints, const odgepoint3d *pvertexlist, const odgevector3d *pnormal = 0); virtual void meshproc(odint32 rows, odint32 columns, const odgepoint3d* vertexlist, const odgiedgedata* pedgedata = 0, const odgifacedata* pfacedata = 0, const odgivertexdata* pvertexdata = 0) { {..} }; virtual void triangleout(const odint32* vertices, const odgevector3d* pnormal) { {..} } virtual void facetout(const odint32* facelist, const odint32* edgeindices, const odgevector3d* pnormal) { {..} }; void setgmtryent(csmplptr apgmtry) { m_apgmtry = apgmtry;}; void setldr(copendwgptr apldr) { m_apldr = apldr;}; private: bool m_btris; csmplptr m_apgmtry; copendwgptr m_apldr; }; end of header ---------------- using it as follows : oddb3dsolidptr od3dsolidptr = odentptr; odstaticrxobject<vectorizer> dv; dv.setgmtryent(ap3dsolid); dv.setldr(this); odstaticrxobject<odgicontextfordbdatabase> gicontext; gicontext.setdatabase(od3dsolidptr->database()); dv.setdrawcontext(&dv); dv.setcontext(&gicontext); dv.output().setdestgeometry(dv); dv.beginviewvectorization(); dv.draw(od3dsolidptr); dv.endviewvectorization(); ------------------------------------------- thanx in advance for your help cheers jason ============================================= hi jason, try this: vectorizer() { //setfilltype(kodgifillalways); odgigeometrysimplifier::m_rendermode = kgouraudshadedwithwireframe; //odgsbasevectorizeview::m_rendermode = kgouraudshadedwithwireframe; odgsbasevectorizeview::setmode(kgouraudshadedwithw ireframe); }; last edited by dmitry a. novikov; 19th july 2006 at 01:45 amfff">. dmitry, thanx and that works great, however i have one last little question, and i will continue looking at the headers to try and work it out, but the triangleout pnormal parameter is always null, how do i get it to calculate the nice smooth normals i would required to have a great looking model, currently i just manually calculate each triangles normal, but it is not as smooth looking as it should be. cheers and thanx again for your help jason quote: originally posted by dmitry a. novikov hi jason, try this: vectorizer() { //setfilltype(kodgifillalways); odgigeometrysimplifier::m_rendermode = kgouraudshadedwithwireframe; //odgsbasevectorizeview::m_rendermode = kgouraudshadedwithwireframe; odgsbasevectorizeview::setmode(kgouraudshadedwithw ireframe); }; jason, vertices' normals you are intersted in are stored in odgigeometrysimplifier and accesible via odgigeometrysimplifier::vertexdata()->normals()fff">: code: void odgsopenglvectorizeview::triangleout( const odint32* indices, const odgevector3d* pnormal ) { // normals are unnecessary // vertex colors are in array // face colors are set up by ontraitsmodified() if((rendermode() <= odgsview::khiddenline) || m_bprocessingttf) { ::glarrayelement(*indices++); ::glarrayelement(*indices++); ::glarrayelement(*indices++); } else // normals are necessary { if(m_bisvertsnormals) { odgiorientationtype orientation = vertexdata()->orientationflag(); for(int i = 0; i < 3; i ++) { if(orientation == kodgicounterclockwise) { ::glnormal3dv((const gldouble*)(vertexdata()->normals()fff"> + indices[i])); } else if(orientation == kodgiclockwise) { odgevector3d normal = -vertexdata()->normals()[indices[i]]; ::glnormal3dv((const gldouble*)&normal); } else // no orientation -- we must calculate it { odgevector3d normal = vertexdata()->normals()[indices[i]]; if(normal.dotproduct(*pnormal) < 0.0) normal *= -1.0; ::glnormal3dv((const gldouble*)&normal); } ::glarrayelement(indices[i]); } } else { ::glnormal3dv((const gldouble*)pnormal); ::glarrayelement(*indices++); ::glarrayelement(*indices++); ::glarrayelement(*indices++); } } } last edited by dmitry a. novikov; 20th july 2006 at 03:56 amfff">. excellent, all seems pretty good, i should be ok from here, and thanks again for your great help. cheers jason quote: originally posted by dmitry a. novikov jason, vertices' normals you are intersted in are stored in odgigeometrysimplifier and accesible via odgigeometrysimplifier::vertexdata()->normals()fff">: code: void odgsopenglvectorizeview::triangleout( const odint32* indices, const odgevector3d* pnormal ) { // normals are unnecessary // vertex colors are in array // face colors are set up by ontraitsmodified() if((rendermode() <= odgsview::khiddenline) || m_bprocessingttf) { ::glarrayelement(*indices++); ::glarrayelement(*indices++); ::glarrayelement(*indices++); } else // normals are necessary { if(m_bisvertsnormals) { odgiorientationtype orientation = vertexdata()->orientationflag(); for(int i = 0; i < 3; i ++) { if(orientation == kodgicounterclockwise) { ::glnormal3dv((const gldouble*)(vertexdata()->normals()fff"> + indices[i])); } else if(orientation == kodgiclockwise) { odgevector3d normal = -vertexdata()->normals()[indices[i]]; ::glnormal3dv((const gldouble*)&normal); } else // no orientation -- we must calculate it { odgevector3d normal = vertexdata()->normals()[indices[i]]; if(normal.dotproduct(*pnormal) < 0.0) normal *= -1.0; ::glnormal3dv((const gldouble*)&normal); } ::glarrayelement(indices[i]); } } else { ::glnormal3dv((const gldouble*)pnormal); ::glarrayelement(*indices++); ::glarrayelement(*indices++); ::glarrayelement(*indices++); } } } |
所有的时间均为北京时间。 现在的时间是 09:49 PM. |