コード例 #1
0
ファイル: Player.cpp プロジェクト: dtbinh/essentialmath
//-------------------------------------------------------------------------------
// @ Player::Update()
//-------------------------------------------------------------------------------
// Main update loop
//-------------------------------------------------------------------------------
void
Player::Update( float dt )
{
    // get scale, rotate, translate for this frame
    float s = 1.0f;
    float r = 0.0f;
    
    // set up scaling
    if (IvGame::mGame->mEventHandler->IsKeyDown(';'))
    {
        s -= 0.25f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('p'))
    {
        s += 0.25f*dt;
    }
    mScale *= s;
    
    // set up rotate
    if (IvGame::mGame->mEventHandler->IsKeyDown('o'))
    {
        r -= kPI*0.25f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('u'))
    {
        r += kPI*0.25f*dt;
    }
    IvMatrix33 rotate;
    rotate.RotationZ(r);
    mRotate = rotate*mRotate;
    
    // set up translation
    IvVector3 xlate;
    xlate.Zero();
    if (IvGame::mGame->mEventHandler->IsKeyDown('k'))
    {
        xlate.x -= 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('i'))
    {
        xlate.x += 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('l'))
    {
        xlate.y -= 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('j'))
    {
        xlate.y += 3.0f*dt;
    }
    mTranslate += xlate;
    
    // clear transform
    if (IvGame::mGame->mEventHandler->IsKeyDown(' '))
    {
        mRotate.Identity();
        mScale = 1.0f;
        mTranslate.Zero();
    }
}   // End of Player::Update()
コード例 #2
0
ファイル: IvQuat.cpp プロジェクト: kristofe/GameEngine
//-------------------------------------------------------------------------------
// @ IvQuat::IvQuat()
//-------------------------------------------------------------------------------
// Rotation matrix constructor
//-------------------------------------------------------------------------------
IvQuat::IvQuat( const IvMatrix33& rotation )
{
    float trace = rotation.Trace();
    if ( trace > 0.0f )
    {
        float s = ::IvSqrt( trace + 1.0f );
        w = s*0.5f;
        float recip = 0.5f/s;
        x = (rotation(2,1) - rotation(1,2))*recip;
        y = (rotation(0,2) - rotation(2,0))*recip;
        z = (rotation(1,0) - rotation(0,1))*recip;
    }
    else
    {
        unsigned int i = 0;
        if ( rotation(1,1) > rotation(0,0) )
            i = 1;
        if ( rotation(2,2) > rotation(i,i) )
            i = 2;
        unsigned int j = (i+1)%3;
        unsigned int k = (j+1)%3;
        float s = ::IvSqrt( rotation(i,i) - rotation(j,j) - rotation(k,k) + 1.0f );
        (*this)[i] = 0.5f*s;
        float recip = 0.5f/s;
        w = (rotation(k,j) - rotation(j,k))*recip;
        (*this)[j] = (rotation(j,i) + rotation(i,j))*recip;
        (*this)[k] = (rotation(k,i) + rotation(i,k))*recip;
    }

}   // End of IvQuat::IvQuat()
コード例 #3
0
ファイル: Player.cpp プロジェクト: Angeldude/essentialmath
//-------------------------------------------------------------------------------
// @ Player::Update()
//-------------------------------------------------------------------------------
// Main update loop
//-------------------------------------------------------------------------------
void
Player::Update( float dt )
{
    // get scale, rotate, translate for this frame
    float s = 1.0f;
    float r = 0.0f;
    
    // set up scaling
    if (IvGame::mGame->mEventHandler->IsKeyDown(';'))
    {
        s -= 0.25f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('p'))
    {
        s += 0.25f*dt;
    }
    mScale *= s;
    
    // set up rotate
    if (IvGame::mGame->mEventHandler->IsKeyDown('o'))
    {
        r -= kPI*0.25f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('u'))
    {
        r += kPI*0.25f*dt;
    }
    IvMatrix33 rotate;
    rotate.RotationZ(r);
    mRotate = rotate*mRotate;
    
    // set up translation
    IvVector3 xlate;
    xlate.Zero();
    if (IvGame::mGame->mEventHandler->IsKeyDown('k'))
    {
        xlate.x -= 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('i'))
    {
        xlate.x += 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('l'))
    {
        xlate.y -= 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('j'))
    {
        xlate.y += 3.0f*dt;
    }
    mTranslate += xlate;
    
    // clear transform
    if (IvGame::mGame->mEventHandler->IsKeyPressed(' '))
    {
        mRotate.Identity();
        mScale = 1.0f;
        mTranslate.Zero();
    }

    // change texture
    if (IvGame::mGame->mEventHandler->IsKeyPressed('t'))
    {
        mCurrentBlendTexIndex = (mCurrentBlendTexIndex + 1) % NUM_BLEND_TEX;
    }

    // change blending mode
    if (IvGame::mGame->mEventHandler->IsKeyPressed('b'))
    {
        mBlendMode = (BlendMode)((mBlendMode + 1) % kBlendModeCount);
    }
}   // End of Player::Update()
コード例 #4
0
ファイル: Player.cpp プロジェクト: Angeldude/essentialmath
//-------------------------------------------------------------------------------
// @ Player::Update()
//-------------------------------------------------------------------------------
// Main update loop
//-------------------------------------------------------------------------------
void
Player::Update( float dt )
{
    // update based on input
    if (IvGame::mGame->mEventHandler->IsKeyPressed(' '))
    {
        if (mRun)
        {
            mTime = 0.0f;
            mRun = false;
        }
        else
        {
            mRun = true;
        }
    }

    if (IvGame::mGame->mEventHandler->IsKeyPressed('m'))
    {
        mMode = (mMode + 1)%4;
    }

    if (mRun)
    {
        mTime += dt;
        // stop just before end so we don't end up with zero vector
        // when we look ahead
        if ( mTime > 11.5f )
            mTime = 11.5f;
    }

    // now we set up the camera
    // get eye position
    IvVector3 eye = mCurve.Evaluate( mTime );
    IvVector3 viewDir;
    IvVector3 viewSide;
    IvVector3 viewUp;

    // set parameters depending on what mode we're in

    // Frenet frame
    if ( mMode == 3 )
    {   
        IvVector3 T = mCurve.Velocity( mTime );
        IvVector3 a = mCurve.Acceleration( mTime );
        IvVector3 B = T.Cross( a );
        B.Normalize();
        T.Normalize();
        IvVector3 N = B.Cross( T );
    
        viewDir = T;
        viewSide = -N;     // have to negate to get from RH frame to LH frame
        viewUp = B;        
    }
    else
    {
        IvVector3 lookAt;
        
        // look same direction all the time
        if ( mMode == 2 ) 
        {
            viewDir = IvVector3::xAxis;
        }
        // look along tangent
        else if ( mMode == 1 )
        {
            viewDir = mCurve.Velocity( mTime );
        }
        // look ahead .5 in parameter
        else if ( mMode == 0 )
        {
            viewDir = mCurve.Evaluate( mTime+0.5f ) - eye;
        }

        // compute view vectors
        viewDir.Normalize();
        viewUp = IvVector3::zAxis - IvVector3::zAxis.Dot(viewDir)*viewDir;
        viewUp.Normalize();
        viewSide = viewDir.Cross(viewUp);
    }

    // now set up matrices
    // build transposed rotation matrix
    IvMatrix33 rotate;
    if ( IvRenderer::mRenderer->GetAPI() == kOpenGL )
    {
        rotate.SetRows( viewSide, viewUp, -viewDir );
    }
    else
    {
        rotate.SetRows( viewSide, viewUp, viewDir );
    }
    // transform translation
    IvVector3 eyeInv = -(rotate*eye);
    // build 4x4 matrix
    IvMatrix44 matrix(rotate);
    matrix(0,3) = eyeInv.x;
    matrix(1,3) = eyeInv.y;
    matrix(2,3) = eyeInv.z;

    ::IvSetViewMatrix( matrix );

}   // End of Player::Update()
コード例 #5
0
ファイル: Player.cpp プロジェクト: Angeldude/essentialmath
//-------------------------------------------------------------------------------
// @ Player::Update()
//-------------------------------------------------------------------------------
// Main update loop
//-------------------------------------------------------------------------------
void
Player::Update( float dt )
{
    float s = 1.0f;
    float r = 0.0f;
    float x = 0.0f, y = 0.0f, z = 0.0f; 
    IvMatrix33 rotate;
    IvVector3 xlate;
    IvMatrix44 transform;
    
    mTurret->Update( dt );
    
    // set up scaling
    if (IvGame::mGame->mEventHandler->IsKeyDown(';'))
    {
        s -= 0.25f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('p'))
    {
        s += 0.25f*dt;
    }
    mScale *= s;
    
    // set up rotate
    if (IvGame::mGame->mEventHandler->IsKeyDown('o'))
    {
        r -= kPI*0.25f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('u'))
    {
        r += kPI*0.25f*dt;
    }
    rotate.RotationZ(r);
    mRotate = rotate*mRotate;
    
    // set up translation
    if (IvGame::mGame->mEventHandler->IsKeyDown('k'))
    {
        x -= 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('i'))
    {
        x += 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('l'))
    {
        y -= 3.0f*dt;
    }
    if (IvGame::mGame->mEventHandler->IsKeyDown('j'))
    {
        y += 3.0f*dt;
    }
    xlate.Set( x, y, z );
    mTranslate += xlate;
    
    // clear transform
    if (IvGame::mGame->mEventHandler->IsKeyDown(' '))
    {
        mRotate.Identity();
        mScale = 0.25f;
        mTranslate.Zero();
    }

}   // End of Player::Update()