// 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(); }
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 ); }