Ŭ¸®ÇÎ ¸Þ½¬

Ãà ¹æÇâ¿¡ ÀÇÇÑ ÀÚ¸£±â¸¦ Çغ¸ÀÚ.  ÃàÀ¸·Î ÀÚ¸£°í ³ª¸é »ï°¢Çü ¸Þ½¬·Î º¸¿©ÁÙ·Á¸é »ï°¢È­ ÀÛ¾÷°ú ³ë¸Ö °ªÀ» ±¸ÇÏ´Â ÀÛ¾÷µµ ÇÊ¿äÇÏ´Ù.

Æú¸®°ï ÀÚ¸£±â

< XÃà , YÃà,  ZÃàÀÇ ÇÑ ÃàÀÇ °ªÀ» ¾Ë¶§ ´Ù¸¥ ÃàÀÇ °ª ±¸ÇÏ±â  >

Æú¸®°ïÀº ¶óÀÎÀ¸·Î ±¸¼º µÇ¾î ÀÖ°í, ¶óÀÎÀº ¼±ÇüÀ̹ǷÎ, ÇÑ ½ÃÀÛÁ¡°ú ³¡Á¡À» ¾Ë°í ÀÖ´Ù¸é ¼±Çü º¸°£À̳ª Á÷¼±ÀÇ ¹æÁ¤½ÄÀ» ÀÌ¿ëÇØ ´Ù¸¥ ÃàÀÇ ÁÂÇ¥¸¦ ±¸ ÇÒ ¼ö ÀÖ´Ù.

±×¸² 1 ó·³ X ÃàÀÇ ÁÂÇ¥°¡ 10, 0, 10À϶§, 5¿¡¼­ ÀÚ¸£´Â °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ.

±×¸² 1) x ÃàÀÇ ÁÂÇ¥

Á÷¼±ÀÇ ¹æÁ¤½Ä¿¡ ÀÇÇØ ÀÚ¸£¸é ´ÙÀ½½ÄÀ» ÀÌ¿ëÇÑ´Ù.

x - x1
x2 - x1
=
y - y1
y2 - y1
=
z - z1
z2 - z1

Á÷¼±ÀÇ ¹æÁ¤½ÄÀ» ÀÌ¿ëÇÑ ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.

inline float LinearEquation( float x, float x1, float x2, float y1, float y2 )

{

    float y = ( x - x1 ) * ( y2 - y1 ) / ( x2 - x1 ) + y1;

    return y;

}

º¸°£À» ÀÌ¿ëÇÑ ¹æ½ÄÀº ´ÙÀ½°ú °°´Ù.

±×¸² 2)º¸°£À» ÀÌ¿ëÇÏ´Â °æ¿ì

º¸°£À» ÀÌ¿ëÇÏ´Â °æ¿ì ÀÚ¸£´Â ÁöÁ¡À» 0À¸·Î ¸¸µç´Ù.  ±×¸² 1À» º¸°£À¸·Î ÀÌ¿ëÇϱâ À§ÇØ º¯È¯ÇÏ¸é ±×¸²2¿Í °°´Ù.
º¯È¯ µÈ °ªÀº -5, 0, 5ÀÌ´Ù . a¿¡¼­ c¿¡ ´ëÇÑ bÀÇ º¸°£À» ±¸ÇÏ¸é ´ÙÀ½°ú °°´Ù.

º¸°£ÀÇ °ª s = a/( a - c ) ³ª s = ( -a )/( c - a ) ·Î ³ªÅ¸³¾¼ö ÀÖ´Ù.

< ¿¬¼ÓµÈ ¶óÀÎÀÇ ÀÚ¸£±â >

¶óÀÎÀ» ÀÚ¸£´Â °æ¿ìÀÇ ¼ö´Â ´ÙÀ½°ú °°´Ù. ±×¸²2¿Í °°ÀÌ Àý´ÜÁ¡À» 0À¸·Î º¯È¯ÈÄ À½¼ö¿Í ¾ç¼ö·Î °í·ÁÇؼ­ »ý°¢ÇÑ´Ù.

½ÃÀÛÁ¡À» a, ³¡Á¡À» b, Áß°£¿¡ Àý´ÜµÇ´Â Á¡À» RÀ̶ó ÇÏÀÚ.

(1) µÎÁ¡ÀÌ ¸ðµÎ Æ÷ÇԵǴ °æ¿ì : bÁ¡ Ãß°¡
(2) µÎÁ¡ÀÌ ¸ðµÎ Æ÷ÇÔµÇÁö ¾Ê´Â °æ¿ì : Ãß°¡ Á¡ ¾øÀ½
(3) ½ÃÀÛÁ¡Á¡ÀÌ Æ÷ÇÔµÈ °æ¿ì: R Ãß°¡
(4) ³¡Á¡ÀÌ Æ÷ÇÔµÈ °æ¿ì: R Ãß°¡, bÁ¡ Ãß°¡

(3), (4)¿Í °°ÀÌ ½ÃÀÛÁ¡°ú ³¡Á¡ÀÇ ºÎÈ£°¡ ´Ù¸£¸é Àý´ÜÀÌ ÀϾ´Â °æ¿ìÀÌ´Ù.
³¡Á¡ÀÌ ÀúÀå µÇ´Â °æ¿ì´Â À½¼öÂÊÀ϶§´Â À½¼ö, ¾ç¼öÂÊÀ϶§´Â ¾ç¼öÀ̸é ÀúÀåÇÑ´Ù.

Á÷¼±ÀÇ ¹æÁ¤½Ä¿¡ ÀÇÇÑ ÇÔ¼ö:    ClipPolyLine1(....),   ClipPolySimple(....)

º¸°£¿¡ ÀÇÇÑ ÇÔ¼ö: ClipTriangle(....)

¸Å°³ º¯¼ö´Â 3°³ÀÇ ÇÔ¼ö ¸ðµÎ ¶È°°À¸´Ï ClipPolyLine1¸¸ »ìÆì º»´Ù.

ClipPolyLine1ÀÇ ¸®ÅÏ°ªÀº Á÷¼±ÀÇ ¹æÁ¤½Ä¿¡ ÀÇÇØ Á¡ÀÇ °¹¼ö¸¦ ¸®ÅÏÇÑ´Ù.
D3DXVECTOR3* in : ÀԷµǴ Æú¸®°ïÀÇ Á¡ÀÌ´Ù.
int n : Á¡ÀÇ °¹¼öÀÌ´Ù.
float out : x, y, z 3Â÷¿ø Á¡À» float Æ÷ÀÎÅÍ¿¡ ÀÇÇØ ¹ÝȯÇÑ´Ù.

float nx, ny, nz : ÀÚ¸£°íÀÚ ÇÏ´Â ÃàÀ» 3°³ Áß¿¡ Çϳª¸¸ -1À̳ª 1·Î ¼³Á¤ÇÏ°í ³ª¸ÓÁö 2°³ÀÇ °ªÀº 0À¸·Î ÇÑ´Ù.
-1À̸é pd°ªº¸´Ù ÀÛÀº °ªÀ» ³²±â°í Å«°ªÀ» À߶󳽴Ù.
1À̸é pd°ªº¸´Ù Å«°ªÀ» ³²±â°í ÀÛÀº °ªÀ» À߶󳽴Ù.

float pd : ÀÚ¸¦¶§ ±âÁØÀÌ µÇ´Â ÃàÀÇ °ªÀÌ´Ù.
º¯¼ö i´Â ¸ñÇ¥Á¡ÀÌ°í, j´Â ½ÃÀÛÁ¡ÀÌ´Ù.

int ClipPolyLine1( const D3DXVECTOR3* in, int n, float* out, float nx, float ny, float nz, float pd )

{

    float d[12];

 

    float basis = (nx + ny + nz) * pd;

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

        d[i] = nx*in[i].x + ny*in[i].y + nz*in[i].z - basis;

 

    int m = 0;

    float x = pd;

    //¶óÀο¡ ´ëÇؼ­ °Ë»ç

    for (int i = 0, j = n-1; i < n; j=i, ++i)

    {

        bool ina = d[j] >= 0;

        bool inb = d[i] >= 0;

        if (ina != inb)

        {

            if( nx != 0 )

            {

                out[m*3+0] = pd;   

                out[m*3+1] = LinearEquation( pd, in[j].x, in[i].x, in[j].y, in[i].y );

                out[m*3+2] = LinearEquation( pd, in[j].x, in[i].x, in[j].z, in[i].z );

            }

            else if( ny != 0 )

            {

                out[m*3+1] = pd;

                out[m*3+0] = LinearEquation( pd, in[j].y, in[i].y, in[j].x, in[i].x );

                out[m*3+2] = LinearEquation( pd, in[j].y, in[i].y, in[j].z, in[i].z );       

            }

            else

            {

                out[m*3+2] = pd;

                out[m*3+0] = LinearEquation( pd, in[j].z, in[i].z, in[j].x, in[i].x );

                out[m*3+1] = LinearEquation( pd, in[j].z, in[i].z, in[j].y, in[i].y );               

            }

            m++;

        }

        if (inb)

        {

            out[m*3+0] = in[i].x;

            out[m*3+1] = in[i].y;

            out[m*3+2] = in[i].z;

            m++;

        }

    }

 

    return m;

}

º¸°£À» ÀÌ¿ëÇÑ ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.

int ClipPolyLine(const D3DXVECTOR3* in, int n, float* out, float nx, float ny, float nz, float pd)

{

    float d[12];

 

    if( nx + ny + nz > 0 )

        pd = -pd;

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

        d[i] = nx*in[i].x + ny*in[i].y + nz*in[i].z + pd;

 

    int m = 0;

    //¶óÀο¡ ´ëÇؼ­ °Ë»ç

    for (int i = 0, j = n-1; i < n; j=i, ++i)

    {

        bool ina = d[j] >= 0;

        bool inb = d[i] >= 0;

        if (ina != inb)

        {

            float s = d[j] / (d[j] - d[i]);   //±æÀÌ¿¡ ´ëÇÑ º¸°£À¸·Î Àüü ±æÀÌ¿¡ ´ëÇÑ d[j]ÀÇ ºñÀ²

 

            out[m*3+0] = in[j].x + (in[i].x - in[j].x)*s;   // b + ( b - a ) * s ´Â pd¸¦ ±âÁØÀ¸·Î ÇÏ´Â ÁÂÇ¥ÀÌ´Ù.

            out[m*3+1] = in[j].y + (in[i].y - in[j].y)*s;

            out[m*3+2] = in[j].z + (in[i].z - in[j].z)*s;

            m++;

        }

        if (inb)

        {

            out[m*3+0] = in[i].x;

            out[m*3+1] = in[i].y;

            out[m*3+2] = in[i].z;

            m++;

        }

    }

    return m;

}

 

»ï°¢È­ (Triangulation)

Æú¸®°ïÀ» ÇÑ Ãà¿¡ ÀÇÇؼ­ ÀÚ¸£¸é Á¡ÀÌ 3°³¿¡¼­ 4°³·Î µÈ´Ù. ´ÙÀÌ·ºÆ® X¿¡¼­ Æú¸®°ïÀ» Ç¥½Ã ÇÒ·Á¸é »ï°¢ÇüÀ¸·Î º¯È¯ µÇ¾î¾ß ÇÑ´Ù.  ÇÑ ÃàÀÌ À߸®°í ³ª¼­ »ç°¢ÇüÀ̱⠶§¹®¿¡, º¹ÀâÇÑ »ï°¢È­ ¾Ë°í¸®ÁòÀ» »ç¿ë ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ¿À¸¥¼Õ ÁÂÇ¥À̱⠶§¹®¿¡ ½Ã°è ¹Ý´ë ¹æÇâÀ¸·Î 2°³ÀÇ »ï°¢ÇüÀ» ÀúÀåÇÏ¸é µÈ´Ù.

ù ¹ø° »ï°¢Çü 0, 1, 2  
µÑ° »ï°¢Çü     0, 2, 3     

DxPolygon::ClipAxis¿¡¼­ else if( n == 4 )ÀÎ °æ¿ì ÇϳªÀÇ »ï°¢ÇüÀ» ´õ ÀúÀåÇÑ´Ù.

 

³ë¸Ö °ª ±¸Çϱâ

ComputePolygonNormal(....)¿¡ ÀÇÇؼ­ ³ë¸Ö°ªÀ» ±¸ÇÑ´Ù.

ÀÚ½ÅÀÇ Æ®¶óÀ̾ޱ۸¸ ±¸ÇÏ´Â °£´ÜÇÑ ¹æ¹ý°ú ÀڽŰú ÀÎÁ¢ÇÏ°í ÀÖ´Â ¸ðµç Æú¸®°ïÀ» ´õÇؼ­ ³ë¸Ö°ªÀ» ±¸ÇÏ¿© ºÎµå·¯¿î Æú¸®°ïÀ» ±¸ÇÏ´Â ¹æ½ÄÀÌ ÀÖ´Ù. ÁÖÀ§ÀÇ Æú¸®°ïÀ» ´õÇÏ¿© ³ë¸Ö°ªÀ» ±¸ÇÏ¸é °è»ê ½Ã°£ÀÌ ¸¹ÀÌ °É¸°´Ù.
¿©±â¼­´Â À妽º¸¦ »ç¿ëÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ °°Àº ÁÂÇ¥ÀÎÁö üũ Çϴ¶ó ½Ã°£ÀÌ ¸¹ÀÌ °É·È´Ù.

ComputeNormal() ³ë¸Ö°ªÀ» ±¸ÇÒ ¶§ ºÒ¸®´Â ±âº» ÇÔ¼öÀÌ´Ù.

void ComputeNormal( D3DXVECTOR3* out, D3DXVECTOR3* p0, D3DXVECTOR3* p1, D3DXVECTOR3* p2 )

{

    D3DXVECTOR3 u = *p1 - *p0; 

    D3DXVECTOR3 v = *p2 - *p0;

 

      D3DXVec3Cross(out, &u, &v);

      D3DXVec3Normalize(out, out);

 

/*

    D3DXVECTOR3 out;

    D3DXVECTOR3 p0 = D3DXVECTOR3( -1, -1, 0 );

    D3DXVECTOR3 p1 = D3DXVECTOR3( -1,  1, 0 );

    D3DXVECTOR3 p2 = D3DXVECTOR3(  1,  0, 0 );

 

    ComputeNormal( &out, &p0, &p1, &p2 ); //0, 0, -1 --> ¿Þ¼Õ ÁÂÇ¥°è¿¡¼­´Â ½Ã°è¹æÇâÀ¸·Î ±¸ÇÑ´Ù.

    ComputeNormal( &out, &p0, &p2, &p1 ); //0, 0, 1 --> ¿À¸¥¼Õ ÁÂÇ¥°è¿¡¼­´Â ¹Ý½Ã°è¹æÇâÀ¸·Î ±¸ÇÑ´Ù.

*/

}

ComputePolygonNormal()Àº ½ÇÁ¦·Î ³ë¸Ö°ªÀ» ±¸ÇÏ¿© ¹öÅؽº ¹öÆÛ¿¡ ³ë¸Ö°ªÀ» ÀÔ·ÂÇÏ°í ÀÖ´Ù.
°£´ÜÇÏ°Ô ±¸ÇÒ ¶§´Â ComputeNormal()À» ÀÌ¿ëÇÏ¿© ³ë¸Ö°ªÀ» Ãß°¡ÇÏ¸é ³¡ÀÌ´Ù.

void ComputePolygonNormal( DxPolygon* polygon )

{

    PointArray& vrtArr = polygon->GetPosition();

    int nSize = (int)vrtArr.size();

    assert( nSize >= 3 );

 

    D3DXVECTOR3 out;

    for( int i = 0; i < nSize; i += 3 )

    {

        D3DXVECTOR3 v0( vrtArr[i].x, vrtArr[i].y, vrtArr[i].z );

        D3DXVECTOR3 v1( vrtArr[i+1].x, vrtArr[i+1].y, vrtArr[i+1].z );

        D3DXVECTOR3 v2( vrtArr[i+2].x, vrtArr[i+2].y, vrtArr[i+2].z );

        ComputeNormal( &out, &v0, &v1, &v2 );

        polygon->PushBackNormal( DataType::Point3( out.x, out.y, out.z )  );

        polygon->PushBackNormal( DataType::Point3( out.x, out.y, out.z )  );

        polygon->PushBackNormal( DataType::Point3( out.x, out.y, out.z )  );

    }

}

 

<ºÎµå·¯¿î Æú¸®°ïÀÇ ³ë¸Ö°ªÀ» ±¸Çϱâ>

À妽º ¹öÆÛ¸¦ »ç¿ëÇÏÁö ¾Ê´Â ¹öÅؽºÀÇ ¹öÆÛÀÇ °æ¿ì ±×¸²Ã³·³ 12(4°³ÀÇ »ï°¢Çü)°³ÀÇ ¹öÅؽº°¡ »ç¿ëµÈ´Ù.

ÇÑÁ¡´ç °øÀ¯µÇ´Â ¸ðµç »ï°¢ÇüÀÇ ³ë¸Ö°ªÀ» ´õÇؼ­ ´Ù½Ã Á¤±ÔÈ­ Çϸé Æú¸®°ïÀÌ ºÎµå·´°Ô º¸ÀδÙ.

1. °øÀ¯ ¹öÅؽº À妽º ±¸Çϱâ

for ¹öÅؽº °¹¼ö ¸¸Å­ ¹Ýº¹
{
    if( ¹öÅؽº À§Ä¡°¡ °°À¸¸é )
          ¹öÅؽº À妽º ÀúÀå( ÀÚ½ÅÀº ÀúÀå ÇÏÁö ¾Ê´Â´Ù )
}

2. ³ë¸Ö°ª ´õÇϱâ

for ¹öÅؽº °¹¼ö ¸¸Å­ ¹Ýº¹  step Æú¸®°ïÀÌÀ¸·Î 3¸¸Å­ Áõ°¡
{
     3°³ÀÇ ¹öÅؽº ³ë¸Ö°ª °è»ê

     °øÀ¯ ¹öÅؽºÀÇ À妽º¸¦ ÀÌ¿ëÇÏ¿© i0¿Í °øÀ¯ÇÏ´Â ¹öÅؽºÀÇ ³ë¸Ö°ª¿¡ ÇöÀç ³ë¸Ö°ªÀ» ¸ðµÎ ´õÇÑ´Ù.

     °øÀ¯ ¹öÅؽºÀÇ À妽º¸¦ ÀÌ¿ëÇÏ¿© i1¿Í °øÀ¯ÇÏ´Â ¹öÅؽºÀÇ ³ë¸Ö°ª¿¡ ÇöÀç ³ë¸Ö°ªÀ» ¸ðµÎ ´õÇÑ´Ù.      

     °øÀ¯ ¹öÅؽºÀÇ À妽º¸¦ ÀÌ¿ëÇÏ¿© i2¿Í °øÀ¯ÇÏ´Â ¹öÅؽºÀÇ ³ë¸Ö°ª¿¡ ÇöÀç ³ë¸Ö°ªÀ» ¸ðµÎ ´õÇÑ´Ù.     
}

3. ³ë¸Ö°ª Á¤±ÔÈ­ Çϱâ

for ¹öÅؽº °¹¼ö ¸¸Å­ ¹Ýº¹
{
    ³ë¸Ö Á¤±ÔÈ­
}

void ComputePolygonNormal( DxPolygon* polygon )

{

    typedef std::vector<int> IndexArrayComponent;

 

    PointArray& vrtArr = polygon->GetPosition();

    int nSize = (int)vrtArr.size();

    if( nSize < 3 )

        return;

 

    //assert( nSize >= 3 );

    D3DXVECTOR3* normal = new D3DXVECTOR3[ nSize ];

    memset( normal, 0, nSize * sizeof( D3DXVECTOR3 ) );

 

    IndexArrayComponent* sharedNormalIndex = new IndexArrayComponent[ nSize ];

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

    {

        for( int k = 0; k < nSize; ++k )

        {

            if( i != k )

            {

                if( vrtArr[i].x == vrtArr[k].x && vrtArr[i].y == vrtArr[k].y && vrtArr[i].z == vrtArr[k].z )

                {

                    sharedNormalIndex[i].push_back( k );

                }

            }

        }   

    }

 

    D3DXVECTOR3 out;

    for( int i = 0; i < nSize; i += 3 )

    {

        D3DXVECTOR3 v0( vrtArr[i].x, vrtArr[i].y, vrtArr[i].z );

        D3DXVECTOR3 v1( vrtArr[i+1].x, vrtArr[i+1].y, vrtArr[i+1].z );

        D3DXVECTOR3 v2( vrtArr[i+2].x, vrtArr[i+2].y, vrtArr[i+2].z );

        ComputeNormal( &out, &v0, &v1, &v2 );

 

        normal[i+0] += out;

        normal[i+1] += out;

        normal[i+2] += out;

 

        int nCount = (int)sharedNormalIndex[i].size();

        IndexArrayComponent& indexArr0 = sharedNormalIndex[i];

        for( int k = 0; k < nCount; ++k )

        {

            int index = indexArr0[k];

            normal[ index ] += out;

        }

 

        nCount = (int)sharedNormalIndex[i+1].size();

        IndexArrayComponent& indexArr1 = sharedNormalIndex[i+1];

        for( int k = 0; k < nCount; ++k )

        {

            int index = indexArr1[k];

            normal[ index ] += out;

        }

 

        nCount = (int)sharedNormalIndex[i+2].size();

        IndexArrayComponent& indexArr2 = sharedNormalIndex[i+2];

        for( int k = 0; k < nCount; ++k )

        {

            int index = indexArr2[k];

            normal[ index ] += out;

        }

    }

 

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

    {

        D3DXVec3Normalize(&normal[i], &normal[i]);

        polygon->PushBackNormal( DataType::Point3( normal[i].x, normal[i].y, normal[i].z )  );

    }

 

    delete [] normal;

    delete [] sharedNormalIndex;

}

 

ÃÖÁ¾ °á°ú´Â ´ÙÀ½°ú °°´Ù.

ºñ³Ê½º »óÀ» xÃàÀ¸·Î ÀÚ¸¥ È­¸éÀÌ´Ù.

À§¿¡¼­ nx°¡ -1À̹ǷΠxÃàÀ¸·Î À߸®°í À½¼ö °ªÀ̹ǷΠ¾ç¼öÃàÀÇ °ªÀÌ Àß·Á ³ª°£´Ù.
basis°¡ 0À̹ǷΠxÃàÀÇ 0ÀÇ °ªÀ» ±âÁØÀ¸·Î ÀÚ¸¥´Ù.