[vtkusers] Transform a disc from center of earth to surface
    Donny Zimmerman 
    donny.zimmerman at willowpointsoftware.com
       
    Fri Dec 30 22:11:46 EST 2011
    
    
  
I am having trouble figuring out how to transform my 2d disc object to a
point and perpendicular to a vector.
 
I am plotting a weather radar which basically is a bunch of polygons onto a
rendering of the earth (vtkGlobeSource).
 
The world coordinates orgin is the center of the earth. The vector from the
origin to the North Pole is the z axis, the vector from the origin to 0
degrees longitude is up the y axis.
 
I am drawing the radar using local coordinates where the center of the radar
is at (0, 0, 0).
 
I need to translate and rotate the radar plot to the surface of the earth at
a known radar location.
 
The two variables I know are the point on the globe and the vector from the
origin (center of earth) to the radar point. 
 
I have tried to calculate the angle of rotation for each axis but I am not
getting the desired results.
 
Here is a code snippet:
 
//Get World Point Of North Pole      
        vtkGlobeSource::ComputeGlobePoint(0, 90.0,
vtkGeoMath::EarthRadiusMeters(),
            radwp);
        
        double np[3];
        np[0] = radwp[0];
        np[1] = radwp[1];
        np[2] = radwp[2];
        vtkMath::Normalize(np);
 
        //m_wpx, m_wpy, and m_wpz are the radar site coordinates
        double px[3];
        px[0] = m_wpx;
        px[1] = 0;
        px[2] = m_wpz;
        vtkMath::Normalize(px);
 
        double yangle = vtkMath::DegreesFromRadians(acos(vtkMath::Dot(px,
np)));
 
        px[0] = 0;
        px[1] = m_wpy;
        px[2] = m_wpz;
        vtkMath::Normalize(px);
 
        double xangle = vtkMath::DegreesFromRadians(acos(vtkMath::Dot(px,
np)));
 
        //Get World Point Of Equator at 0 Deg Longitude      
        vtkGlobeSource::ComputeGlobePoint(0, 0,
vtkGeoMath::EarthRadiusMeters(),
            radwp);        
 
        double eq[3];
        eq[0] = radwp[0];
        eq[1] = radwp[1];
        eq[2] = radwp[2];
        vtkMath::Normalize(eq);
 
        double pz[3];
        pz[0] = m_wpx;
        pz[1] = m_wpy;
        pz[2] = 0;
        vtkMath::Normalize(pz);
 
        double zangle = vtkMath::DegreesFromRadians(acos(vtkMath::Dot(pz,
eq)));
 
        
        vtkSmartPointer<vtkTransformPolyDataFilter> tf =
vtkSmartPointer<vtkTransformPolyDataFilter>::New(); 
        tf->SetInput(polydata);
        vtkSmartPointer<vtkTransform> xfm =
vtkSmartPointer<vtkTransform>::New();
        xfm->Identity();
        xfm->Translate(m_wpx, m_wpy, m_wpz);        
        xfm->RotateX(xangle);
        xfm->RotateY(yangle);
        // Need to subtract from 180 degrees to point top of radar to north
pole.
        xfm->RotateZ(180.0 - zangle);
        tf->SetTransform(xfm);
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20111230/3cac5dc6/attachment.htm>
    
    
More information about the vtkusers
mailing list