XML Exporter: Mesh

º»ÀÌ ¾Æ´Ñ Á¤ÀûÀÎ ¸Þ½¬¸¦ Ãâ·ÂÇÑ´Ù  ¿Þ¼Õ ÁÂÇ¥°è¿Í ·ÎÄà Çà·Ä Àû¿ëÀº ´ÙÀ½Àå¿¡ ±¸Çö ÇÑ´Ù.
¸Þ½¬ Ãâ·ÂÀº Export::CreateBaseMesh() ¸Þ½îµå¿¡¼­ Á¤Á¡°ú Á¤Á¡ À妽º¸¦ ÀúÀåÇÑ´Ù.

¸Þ½¬ Ãâ·ÂÀº ´ÙÀ½ÀÇ ´Ü°è·Î ÁøÇàÇÑ´Ù.

1. Object::ConvertToType()ÀÇ ¸®ÅÏ°ª TriObject*ÀÌ Á¸Àç ÇÏ¸é »ï°¢Çü ¸Þ½¬·Î ÀͽºÆ÷Æ® °¡´ÉÇÏ´Ù.

2. TriObject::GetMesh()ÀÇ ¸®ÅÏ°ª Mesh*ÀÌ Á¸Àç Çϸé Á¤Á¡°ú Á¤Á¡ À妽º¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù.

3. Object::ConvertToType() ¸Þ½îµå¿¡ ÀÇÇØ »ï°¢Çü ¸Þ½¬·Î º¯È¯ÇÑ´Ù. ¸®ÅÏ°ªÀº TriObject* ÀÌ´Ù.

4. TriObject::GetMesh()·Î Mesh*¸¦ ±¸ÇÑ´Ù.

5. Mesh°¡ ÀÖÀ¸¸é 3DSMAXÀÇ ¾À±¸Á¶¿Í´Â »ó°ü¾øÀÌ "mesh" ¿¤¸®¸ÕÆ® ³ëµå¸¦ Ãß°¡ÇÏ¿© Á¤Á¡ÀÇ Á¤º¸µéÀ» "mesh" ¿¤¸®¸ÕÆ®ÀÇ ÀÚ½Ä ¿¤¸®¸ÕÆ®·Î Ãß°¡ ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.

5. Mesh::getNumVerts()·Î Á¤Á¡ °¹¼ö¸¦ ±¸Çؼ­, °¹¼ö ¸¸Å­ ¸®ÅÏ°ª Point3·Î ÁÂÇ¥¸¦ ±¸ÇÑ´Ù.
Point3 Mesh::verts[index]   Point3´Â ¸Æ½ºÀÇ 3D Á¤Á¡ Ŭ·¡½ºÀÌ´Ù.

6. Mesh::getNumFaces()·Î »ï°¢Çü À妽º 3°³¸¦ ±¸Çؼ­, °¹¼ö ¸¸Å­ ¸®ÅÏ°ª int·Î Á¤Á¡ÀÇ À妽º¸¦ ±¸ÇÑ´Ù.
int Mesh::faces[index].v[0]
int Mesh::faces[index].v[1]
int Mesh::faces[index].v[2]

¾Æ·¡ ÄÚµå´Â CreateBaseMesh()ÀÇ Àüü ÄÚµåÀÌ´Ù.

XmlNode* Export::CreateBaseMesh( INode* pNode, XmlNode* pParentXML )

{

    XmlNode* pXmlNode = CreateXmlNode( "GEOMOBJECT_CLASS_ID" );

    pXmlNode->AddAttribute( "name", pNode->GetName() );

 

    //»ï°¢Çü ¸Þ½¬·Î ¹Ù²Ü¼ö Àִ°¡?

    Object* pObject = pNode->GetObjectRef();

    if( pObject->CanConvertToType( Class_ID(TRIOBJ_CLASS_ID, 0)) == 0 )

        return pXmlNode;

 

    //»ï°¢Çü ¸Þ½¬·Î º¯È¯

    TriObject* pTri = (TriObject *)pObject->ConvertToType(0, Class_ID(TRIOBJ_CLASS_ID, 0));

    if(NULL == pTri)

        return pXmlNode;

 

    //¸Þ½¬ °´Ã¼¸¦ ±¸ÇÑ´Ù.

    Mesh* pMesh    = &pTri->GetMesh();

    if( pMesh == NULL )

        return pXmlNode;

 

    //¸Þ½¬¸¦ À§ÇÑ ³ëµå´Â ¸Æ½º¿Í »ó°ü¾øÀÌ Ãß°¡ÀûÀ¸·Î »ý¼ºÇؼ­ ¸Þ½¬ µ¥ÀÌÅ͸¦ ÀÌ ¾Æ·¡·Î Ãß°¡ÇÑ´Ù.

    char* szObjName = GetPrimitiveName( pObject );

    XmlNode* pXmlMeshNode = CreateXmlNode( "mesh" );

    pXmlMeshNode->AddAttribute( "name",szObjName );

    pXmlNode->AttachChild( pXmlMeshNode );

 

    //Á¤Á¡ µ¥ÀÌÅÍ

    int    numVertex    = pMesh->getNumVerts();

    XmlNode* pXmlVertexNode = CreateXmlNode( "Vertex" );

    pXmlMeshNode->AttachChild( pXmlVertexNode );

    pXmlVertexNode->AttachChild( CreateXmlNode( "Number" ) )->SetData( ToString( numVertex ) );

    for (int i=0; i < numVertex; ++i)

    {

        Point3 v = pMesh->verts[i];

        base::Vector3 pos( v.x, v.y, v.z );

        pXmlVertexNode->AttachChild( CreateXmlNode( "data" ) )->SetData( ToString(pos) );

    }

 

    //Á¤Á¡ À妽º

    int numFace = pMesh->getNumFaces();

    XmlNode* pXmlFaceNode = CreateXmlNode( "Face" );

    pXmlMeshNode->AttachChild( pXmlFaceNode );

    pXmlFaceNode->AttachChild( CreateXmlNode( "Number" ) )->SetData( ToString( numFace ) );

    for( int i = 0; i < numFace; ++i )

    {

        base::Index3 index;

        index.a = pMesh->faces[i].v[0];

        index.b = pMesh->faces[i].v[1];

        index.c = pMesh->faces[i].v[2];

        pXmlFaceNode->AttachChild( CreateXmlNode( "data" ) )->SetData( ToString(index) );

    }

 

    return pXmlNode;

}

ÇÁ·ÎÁ§Æ®: maxProject_mesh.zip