XML Exporter: ³ë¸Ö°ª Àû¿ë

·¥¹öÆ® Á¶¸íÀ» Àû¿ëÇϱ⠸ƽºÀͽºÆ÷Æ®½Ã ³ë¸Ö°ªÀ» ÀúÀåÇÏ°í ºä¾î¿¡¼­ ³ë¸Ö°ªÀ» ÀÐ°í ¼ÎÀÌ´õ¿¡¼­ ·¥¹öÆ® Á¶¸íÀ» ÀÌ¿ëÇØ ¸é¿¡ ¸í¾ÏÀ» Ç¥½Ã ÇÑ´Ù.

< ¸Æ½º Ç÷¯±×ÀÎ ³ë¸Ö°ª ÃßÃâ >

¹ý¼± º¤Å͸¦ ÃßÃâÇϱâ À§ÇØ Mesh::BuildNormals()¸¦ ½ÇÇàÇÑ´Ù. ¹ý¼±º¤ÅÍ´Â "Normal"³ëµå¸¦ ¸¸µé°í ÀúÀåÇÑ´Ù.
Point3 v = Normalize( pMesh->getNormal(i) ) Á¤Á¡°¹¼ö¸¸Å­ ³ëµå¸¦ ±¸ÇÑ´Ù.

XmlExp* Export::WriteBaseMesh( INode* pNode, XmlExp* pParentXML )

{

    ............

    //³ë¸Ö°ª

    pMesh->buildNormals();

    XmlNode* pXmlNormalNode = CreateXmlNode<XmlExp>( "Normal" );

    pXmlMeshNode->AttachChild( pXmlNormalNode );

    pXmlNormalNode->AddAttribute( "count", ToString( numVertex ).c_str() );

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

    {

        //³ë¸Ö°ª ÃßÃâ

        Point3 v = Normalize( pMesh->getNormal(i) );   

 

        if( GetLeftHand() )

        {

            float temp = v.y;

            v.y = v.z;

            v.z = temp;

        }

 

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

        pXmlNormalNode->AttachChild( CreateXmlNode<XmlExp>( "data" ) )->SetData( ToString(pos) );

    }

    ..........

}

< ºä¾î¿¡ ³ë¸Ö Ãß°¡ >

ConvertMeshInfo()¿¡¼­ Normal Á¤º¸¸¦ Àд´Ù.

void XmlMesh::ConvertMeshInfo()

{

    ..........   

    //¸Þ½¬ ³ë¸Ö°ª Àбâ

    XmlNode* pNormalXmlNode = FindFirstChild( "Normal" );

    if( pNormalXmlNode == NULL )

        return;

    pXmlMesh = (XmlMesh*)pNormalXmlNode;

    pXmlMesh->FetchNormal( GetParent()->m_vertexArr );

    ..........

}

 

void XmlMesh::FetchNormal( std::vector<VertexInfo>& vertexArr )

{

    //"Normal" ¿¤¸®¸ÕÆ® - "count" ¼Ó¼º ±¸Çϱâ

    int number = GetIntAttribute( this, "count" );

    if( number < 3 )

        return;

 

    //"Normal" ¿¤¸®¸ÕÆ® "data" ¿¤¸®¸ÕÆ® ±¸Çϱâ

    XmlNodeVector nodeArr;

    FindChild( "data", nodeArr );

    if( nodeArr.size() != number )

        return;

 

    XmlNodeVector::iterator iter = nodeArr.begin();

    XmlNodeVector::iterator endIter = nodeArr.end();

    for( int index = 0; iter != endIter; ++iter, ++index )

    {

        XmlNode* xmlNode = *iter;

        vertexArr[index].n = ToVector3( *xmlNode->GetData() );

    }

}

¸Þ½Ã Á¤Á¡ ±¸Á¶Ã¼ ¼±¾ð

struct ShaderBlendVertex

{

    D3DXVECTOR3    p;            //¸Þ½ÃÀÇ Á¤Á¡

 

    FLOAT        weight[3];        // BLEND WEIGHT

    BYTE        boneIndex[4];    // MATRIX Index

 

    D3DXVECTOR3        n;            //¸Þ½ÃÀÇ ³ë¸Ö°ª

 

    ShaderBlendVertex() : p(0,0,0), n(0, 0, 0)

    {

        boneIndex[0] = boneIndex[1] = boneIndex[2] = boneIndex[3] = 0;

        weight[0] = weight[1] = weight[2] = 0;

    }

 

    enum {    FVF = (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 | D3DFVF_NORMAL),    };

};

Á¤Á¡ ¹öÆÛ »ý¼º

int EShaderBoneMesh::CreateVertexBuffer( XmlNode* pXmlNode )

{

    ..............

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

    {

        ..............               

        m_pMeshVerts[i].n.x = xmlVx[i].n.x;

        m_pMeshVerts[i].n.y = xmlVx[i].n.y;

        m_pMeshVerts[i].n.z = xmlVx[i].n.z;

        ..............

    }

}

·¥¹öÆ® Á¶¸í °ø½ÄÀ¸·Î ¼ÎÀÌ´õ °è»ê

float    Ks = 0.1f;

float    Kd = 0.8f;

float    Ka = 1.0f;

float4    specular = { 1, 1, 1, 1};

float4  diffuse = { 0.7f, 0.7f, 0.7f, 1 };

float4  ambient = { 0.5f, 0.5f, 0.5f, 1 };

float4  lightDir = { 0.5f, -0.5f,0.5f, 1 };

float    n_specular = 1;

 

struct VsOut

{

    float4    Pos: POSITION;

    float4    Diff: COLOR0;   

    float4  Spec: COLOR1;

};

 

VsOut VtxBlend(float4 Pos: POSITION, float4 Wgt: BLENDWEIGHT, int4 Idx: BLENDINDICES, float3 Nor: NORMAL)

{

    .............

    Out.Pos = Pout;

    float3 vNormal = mul( Nor, m_mtViw);

    float4 vLight = -lightDir;

    Out.Diff = ambient*Ka + diffuse*Kd*max(0, dot(vNormal, vLight ) );

 

    float3 Pview = mul( Pout, mtW );

    float3 vView = -normalize( Pview );

    float3 vReflect = normalize(2*dot(vNormal, vLight ) * vNormal - vLight);

    Out.Spec = specular*Ks*pow( max(0, dot(vReflect, vView)), n_specular);

    return Out;

}

¸Æ½º Ç÷¯±×ÀÎ ÇÁ·ÎÁ§Æ®: maxProject_normal.zip
ºä¾î ÇÁ·ÎÁ§Æ®: viewer_normal.zip