Ãà ¹æÇâ¿¡ ÀÇÇÑ ÀÚ¸£±â¸¦ Çغ¸ÀÚ. ÃàÀ¸·Î ÀÚ¸£°í ³ª¸é »ï°¢Çü ¸Þ½¬·Î º¸¿©ÁÙ·Á¸é »ï°¢È ÀÛ¾÷°ú ³ë¸Ö °ªÀ» ±¸ÇÏ´Â ÀÛ¾÷µµ ÇÊ¿äÇÏ´Ù.
Æú¸®°ï ÀÚ¸£±â
< XÃà , YÃà, ZÃàÀÇ ÇÑ ÃàÀÇ °ªÀ» ¾Ë¶§ ´Ù¸¥ ÃàÀÇ °ª ±¸Çϱâ >
Æú¸®°ïÀº ¶óÀÎÀ¸·Î ±¸¼º µÇ¾î ÀÖ°í, ¶óÀÎÀº ¼±ÇüÀ̹ǷÎ, ÇÑ ½ÃÀÛÁ¡°ú ³¡Á¡À» ¾Ë°í ÀÖ´Ù¸é ¼±Çü º¸°£À̳ª Á÷¼±ÀÇ ¹æÁ¤½ÄÀ» ÀÌ¿ëÇØ ´Ù¸¥ ÃàÀÇ ÁÂÇ¥¸¦ ±¸ ÇÒ ¼ö ÀÖ´Ù.
±×¸² 1 ó·³ X ÃàÀÇ ÁÂÇ¥°¡ 10, 0, 10À϶§, 5¿¡¼ ÀÚ¸£´Â °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ.
±×¸² 1) x ÃàÀÇ ÁÂÇ¥
Á÷¼±ÀÇ ¹æÁ¤½Ä¿¡ ÀÇÇØ ÀÚ¸£¸é ´ÙÀ½½ÄÀ» ÀÌ¿ëÇÑ´Ù.
Á÷¼±ÀÇ ¹æÁ¤½ÄÀ» ÀÌ¿ëÇÑ ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
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ÀÇ °ªÀ» ±âÁØÀ¸·Î ÀÚ¸¥´Ù.
|