几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   DirectDWG (http://www.dimcax.com/hust/forumdisplay.php?f=89)
-   -   【转帖】vecotrizing 3d Solids Part 2 (http://www.dimcax.com/hust/showthread.php?t=18980)

yang686526 2009-05-07 06:15 PM

【转帖】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++);
}
}
}


所有的时间均为北京时间。 现在的时间是 06:50 AM.