几何尺寸与公差论坛------致力于产品几何量公差标准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)
-   -   【转帖】normals and texture coordinate (http://www.dimcax.com/hust/showthread.php?t=17347)

yang686526 2009-05-06 06:38 PM

【转帖】normals and texture coordinate
 
normals and texture coordinate
normals and texture coordinate
hello,
i need to know how to extract the texture coordinates and normals of all vertexs of a 3d solid.
my code is:
void dxf_3dsolid_geometria_obtener (dxf_polilinea_paso ** lineas, int * numerolineas, oddbentity punteroentidadglobal)
{
try
{
/* obtener un puntero al solido 3d */
oddb3dsolidptr punterosolido3d=oddb3dsolid::cast(punteroentidadgl obal);
/* explotar el s髄ido en mallas policara */
odrxobjectptrarray entidadesprimernivel;
punterosolido3d->explodegeometry(entidadesprimernivel);
for(unsigned i=0; i<entidadesprimernivel.size(); i++)
{
if( 0==strcmp("acdbpolyfacemesh", entidadesprimernivel[i]->isa()->name()) )
{
oddbpolyfacemeshptr mallapolycara = oddbpolyfacemesh::cast(entidadesprimernivel[i]);
/* para cada malla poly cara obtener sus tri醤gulos */
odrxobjectptrarray entidadessegundonivel;
mallapolycara->explode(entidadessegundonivel);
for(unsigned j=0; j<entidadessegundonivel.size(); j++)
{
if( 0==strcmp("acdbface", entidadessegundonivel[j]->isa()->name()) )
{
/* generar tri醤gulo */
oddbfaceptr punterocara = oddbface::cast(entidadessegundonivel[j]);
dxf_polilinea_paso polilinea;
polilinea.visible = 1;
polilinea.r = 255;
polilinea.g = 255;
polilinea.b = 255;
polilinea.relleno = 1;
polilinea.numero_puntos = 4;
polilinea.puntos = 0x0;
polilinea.puntos = (double*)malloc(4*3*sizeof(double));
odgepoint3d vertice;
/* primer punto */
punterocara->getvertexat(0, vertice);
polilinea.puntos[3*0+0] = vertice.x;
polilinea.puntos[3*0+1] = vertice.y;
polilinea.puntos[3*0+2] = vertice.z;
/* segundo punto */
punterocara->getvertexat(1, vertice);
polilinea.puntos[3*1+0] = vertice.x;
polilinea.puntos[3*1+1] = vertice.y;
polilinea.puntos[3*1+2] = vertice.z;
/* tercer punto */
punterocara->getvertexat(2, vertice);
polilinea.puntos[3*2+0] = vertice.x;
polilinea.puntos[3*2+1] = vertice.y;
polilinea.puntos[3*2+2] = vertice.z;
/* primer punto(es un tri醤gulo ) */
/*punterocara->getvertexat(0, vertice);*/
polilinea.puntos[3*3+0] = polilinea.puntos[3*0+0];
polilinea.puntos[3*3+1] = polilinea.puntos[3*0+1];
polilinea.puntos[3*3+2] = polilinea.puntos[3*0+2];
(*numerolineas) ++;
(*lineas) = (dxf_polilinea_paso *)realloc((*lineas), (*numerolineas)*sizeof(dxf_polilinea_paso));
(*lineas)[(*numerolineas)-1] = polilinea;
}
}
}
}
}
catch(...)
{
fprintf(stderr, "error en dxf_3dsolid_geometria_obtener\n");
}
}
greetings,
thank you very much

polyfacemesh and face does not have normals or texture coordinates. normals can be calculated manually for exploded 3dsolid faces.
texture coordinates also calculate only at rendering time, using current material and material mapper setupped to traits.
see for example triangleout() routine in directx or opengl rendering devices src.


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