void SSRectangle::Update() { Geom* geom = VehicleMgr.GetVehicle()->FindGeom( m_CompID ); if ( !geom ) { return; } vec3d center; vector< vec3d > pntVec; center = vec3d( m_CenterU(), m_CenterW(), 0 ); // Rotation Matrix Matrix4d transMat1, transMat2; Matrix4d rotMat; rotMat.loadIdentity(); rotMat.rotateZ( m_Theta() ); transMat1.loadIdentity(); transMat1.translatef( center.x() * -1, center.y() * -1, 0 ); transMat2.loadIdentity(); transMat2.translatef( center.x(), center.y(), 0 ); // Make points in counter clockwise fashion; pntVec.resize( 5 ); pntVec[0] = center + vec3d( m_ULength(), m_WLength(), 0 ) * -0.5; pntVec[1] = center + vec3d( m_ULength(), -1.0 * m_WLength(), 0 ) * 0.5; pntVec[2] = center + vec3d( m_ULength(), m_WLength(), 0 ) * 0.5; pntVec[3] = center + vec3d( -1.0 * m_ULength(), m_WLength(), 0 ) * 0.5; pntVec[4] = pntVec[0]; // Apply transformations for ( int i = 0; i < 5 ; i++ ) { pntVec[i] = transMat2.xform( rotMat.xform( transMat1.xform( pntVec[i] ) ) ); } int pind = 0; for ( int i = 0 ; i < 4; i++ ) { m_LVec[i].SetSP0( pntVec[pind] ); pind++; m_LVec[i].SetSP1( pntVec[pind] ); m_LVec[i].Update( geom ); } SubSurface::Update(); }
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 ); }
// Main Update Routine void SSEllipse::Update() { UpdateLVecSize(); Geom* geom = VehicleMgr.GetVehicle()->FindGeom( m_CompID ); if ( !geom ) { return; } int num_pnts = m_Tess(); vec3d center; center = vec3d( m_CenterU(), m_CenterW(), 0 ); // Rotation Matrix Matrix4d transMat1, transMat2; Matrix4d rotMat; rotMat.loadIdentity(); rotMat.rotateZ( m_Theta() ); transMat1.loadIdentity(); transMat1.translatef( center.x() * -1, center.y() * -1, 0 ); transMat2.loadIdentity(); transMat2.translatef( center.x(), center.y(), 0 ); double a = m_ULength() / 2; double b = m_WLength() / 2; for ( int i = 0 ; i < num_pnts ; i++ ) { double p0 = 2 * PI * ( double )i / num_pnts; double p1 = 2 * PI * ( double )( i + 1 ) / num_pnts; vec3d pnt = vec3d(); pnt.set_xyz( a * cos( p0 ) + m_CenterU(), b * sin( p0 ) + m_CenterW(), 0 ); pnt = transMat2.xform( rotMat.xform( transMat1.xform( pnt ) ) ); m_LVec[i].SetSP0( pnt ); pnt.set_xyz( a * cos( p1 ) + m_CenterU(), b * sin( p1 ) + m_CenterW(), 0 ); pnt = transMat2.xform( rotMat.xform( transMat1.xform( pnt ) ) ); m_LVec[i].SetSP1( pnt ); m_LVec[i].Update( geom ); } SubSurface::Update(); }