3D Æ÷¹°¼± ¿îµ¿ °ø½Ä

Æ÷¹°¼± ¿îµ¿Àº µî°¡¼Óµµ ¿îµ¿À¸·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.
µî°¡¼Óµµ ¿îµ¿À̶õ ¼Óµµ°¡ ÀÏÁ¤ÇÑ ¿îµ¿ÀÌ´Ù.

½ÇÁ¦ Äڵ忡¼­ t°¡ deltaTimeÀ̶ó°í ÇÑ´Ù¸é S0, V0´Â ÀÌÀü À§Ä¡¿Í ¼Óµµ·Î º¸¸é µÈ´Ù.

< ù¹ø° ½Ä >

¿©±â¼­ t´Â delta timeÀÌ´Ù.

v(t) = v0 + a*t  
p(t) = p0 + v*t

velocity = velocity + gravity*deltaTime
position = position + velocity*deltaTime

or

position = position + velocity*deltaTime
velocity = velocity + gravity*deltaTime

¾Æ·¡ ½ÄÀº ÃÖÃÊ °ª¿¡ Áß·ÂÀ» ´õÇÏÁö ¾Ê°í ÀÖ´Ù.
±×·¡ÇÁ¸¦ ±×·Áº¸¸é Å©°Ô Â÷ÀÌ°¡ ¾ø±â ¶§¹®¿¡ ±×³É À§½ÄÀ¸·Î ÇÑ´Ù.

void Object::Update(float deltaTime)

{

    static Vector3 gravity(0.0f, -9.8f, 0.0f);

 

    m_velocity += gravity * deltaTime;

    m_position += m_velocity * deltaTime;

}

< µÎ¹ø° ½Ä >

¿©±â¼­ t´Â delta timeÀÌ´Ù.

p(t) = p0 + v0*t + 1/2*a*t^2
v(t) = v0 + a*t

void Object::Update1(float deltaTime)

{

    static Vector3 gravity(0.0f, -9.8f, 0.0f);

 

    m_position += m_velocity * deltaTime + 0.5f * gravity  * deltaTime * deltaTime;

    m_velocity += gravity * deltaTime;

}

< ¹Ý»ç º¤ÅÍ >

R = P +  2n(-P·n)

R : ¹Ý»çº¤ÅÍ
P : ÀԻ纤ÅÍ
n : º®ÀÇ ¹ý¼±º¤ÅÍ

void Object::Reflect(Vector3& velocity, Vector3& normal )

{

    Vector3 v = velocity;

    float vLength = v.Length();

    v.Normalize();

 

    const float dotProductTimesTwo = Dot(v, normal) * 2.0f;

    v -= (dotProductTimesTwo * normal);

 

    velocity = v * vLength;

}

³ôÀÌ y°¡ 0ÀÌ¸é ¹Ù´Ú¿¡ Ãæµ¹Çϴ°ɷΠ°¡Á¤ÇÏ¿© ¹Ý»çº¤Å͸¦ Àû¿ëÇØ º¸ÀÚ.
ReflectÀÇ Ã¹ ¹ø° ÀÎÀÚ´Â ¹Ý»çµÈ º¤ÅÍÀÇ ¼Óµµ¸¦ ¹ÝȯÇÑ´Ù.

void Object::Update(float deltaTime)

{

    static Vector3 gravity(0.0f, -9.8f, 0.0f);

 

    m_velocity += gravity * deltaTime;

    m_position += m_velocity * deltaTime;

 

    //Ãæµ¹ ÇϵåÄÚµù, ³ôÀÌ°¡ 0º¸´Ù ÀÛÀ¸¸é ¹Ù´Ú°ú Ãæµ¹ÀÌ¶ó °¡Á¤

    if(m_position.y <  0.0f)

    {

        Reflect( m_velocity, Vector3( 0, 1, 0));

        m_velocity *= 0.5f; //¹Ý¹ßÀ» 1/2·Î Ãà¼Ò
        
m_position.y = 0.0f;

    }

}

 

void Object::Update1(float deltaTime)

{

    static Vector3 gravity(0.0f, -9.8f, 0.0f);

 

    m_position += m_velocity * deltaTime + 0.5f * gravity  * deltaTime * deltaTime;

    m_velocity += gravity * deltaTime;

 

    //Ãæµ¹ ÇϵåÄÚµù, ³ôÀÌ°¡ 0º¸´Ù ÀÛÀ¸¸é ¹Ù´Ú°ú Ãæµ¹ÀÌ¶ó °¡Á¤

    if(m_position.y <  0.0f)

    {

        Reflect( m_velocity, Vector3( 0, 1, 0));

        m_velocity *= 0.5f; //¹Ý¹ß·Â¿¡ ÀÇÇØ 1/2·Î ¼Óµµ °¨¼Ò
        
m_position.y = 0.0f;

    }

}

 

¼Ò½º : uniformAcceleration.zip

 

< Âü°í : Æ÷¹°¼±ÀÇ ¹æÁ¤½Ä Ãß°¡ ¼³¸í >

°ø½ÄÀÇ ÀÌÁö´Â http://smilejsu.tistory.com/612 ȨÆäÀÌÁö¿¡¼­ °¡Á®¿È)

Áß·ÂÀ» Àû¿ëÇÑ À§Ä¡´Â ´ÙÀ½°ú °°ÀÌ ±¸ÇÑ´Ù.

ÂüÁ¶)
http://www.niksula.hut.fi/~hkankaan/Homepages/gravity.html
http://www.gpgstudy.com/forum/viewtopic.php?t=19899&highlight=