// Called when the mouse moves
void GLDvrWidget::mouseMoveEvent(QMouseEvent *event) {
    std::cout << "GLDvrWidget::mouseMoveEvent()" << std::endl;
    // TODO (CA2)

    int y = event->y();
    int x = event->x();

    int dy = y - m_prevMouseY;
    int dx = x - m_prevMouseX;

    if(event->buttons() & Qt::LeftButton) {

        Matrix4d rotX;
        rotX.identity();
        rotX.rotate(0.5 * dy, Vector3d(1., 0., 0.));

        // Update the stored transformation with the one just computed
        m_matRotX *= rotX;

        Matrix4d rotY;
        rotY.identity();
        rotY.rotate(0.5*dx,Vector3d(0.,1.,0.));

        m_matRotY *= rotY;
    }

    m_prevMouseX = x;
    m_prevMouseY = y;

    this->updateContent();
}
예제 #2
0
void PropPositioner::Update()
{
    m_NeedsUpdate = false;

    m_TransformedCurve = m_Curve;

    Matrix4d mat;
    mat.scale( m_Chord );

    if ( m_Reverse < 0 )
    {
        mat.translatef( 1.0, 0.0, 0.0 );
        mat.flipx();
    }

    m_TransformedCurve.Transform( mat );

    if ( !m_ParentProp )
    {
        return;
    }

    // Basic transformation orients curve before other transformations.
    m_ParentProp->GetBasicTransformation( m_Chord, mat );
    m_TransformedCurve.Transform( mat );

    mat.loadIdentity();

    // Propeller rotation first because order is reversed.
    mat.rotateX( -m_Reverse * m_PropRot );

    mat.translatef( m_FoldOrigin.x(), m_FoldOrigin.y(), m_FoldOrigin.z() );
    mat.rotate( m_FoldAngle * PI / 180.0, m_FoldDirection );
    mat.translatef( -m_FoldOrigin.x(), -m_FoldOrigin.y(), -m_FoldOrigin.z() );

    mat.rotateY( m_Reverse * m_Feather );

    mat.translatef( 0, m_Radius, 0 );

    mat.rotateY( m_Reverse * m_Twist );

    mat.rotateX( m_XRotate ); // About rake direction

    mat.translatef( m_Rake, 0, m_Reverse * m_Skew );

    mat.rotateZ( m_ZRotate ); // About chord

    m_TransformedCurve.Transform( mat );
}