Hi Cedric,

Thanks for explanation.  The invert of the data is to go from GDAL
default of top left orign, to bottom left origin that OpenGL/OSG use.

Could you send me the data you had problems with an I'll have a bash
at reproducing the problem at my end.

Robert.

On Dec 11, 2007 3:16 PM, Cedric Pinson <[EMAIL PROTECTED]> wrote:
> I read the georeferenced tiff with this plugin it return me an
> osg::HeightField
> then i use it like that:
>
>   osg::ref_ptr<osg::ShapeDrawable> shape = new
> osg::ShapeDrawable(heightField);
>   {
>   MyTriangulatorForDisplay triangulator;
>   shape->accept(triangulator);
>   triangulator.postProcess();
>   _geometry = triangulator._geometry;
>   }
>
> so the i passe in void PrimitiveShapeVisitor::apply(const HeightField&
> field) that call my functor below.
> It's ok for that just the result is not what it should be i mean
> vertexes position are not where they would be.
>  From the gdal documentation http://www.gdal.org/gdal_tutorial.html
>
>     adfGeoTransform[0] /* top left x */
>     adfGeoTransform[1] /* w-e pixel resolution */
>     adfGeoTransform[2] /* rotation, 0 if image is "north up" */
>     adfGeoTransform[3] /* top left y */
>     adfGeoTransform[4] /* rotation, 0 if image is "north up" */
>     adfGeoTransform[5] /* n-s pixel resolution */
>
> and in the original plugin at line 679 there is TopLeft[1] =
> geoTransform[1]; so it's not the good index it should be geoTransform[3];
> because geoTransform[1] is the w-e pixel resolution. So i just fixed the
> topLeft position.
>
> Then the other fix is the setOrigin . the original version switch the
> corner of the origin, i think it was done to have the computation of
> normal and the triangle in counter clockwize. But it does not work, i
> imagine it works for special case because value from TopLeft are bad and
> other value are computed with it.
>
> hf->setOrigin(osg::Vec3(BottomLeft[0],-BottomLeft[1],0));
>
>
> So i change it to have the good origin (top left x, and bottom left y),
> and the pixel delta are taken from the georeference data but i change
> the sign of y pixel delta because the corner is not on the top but on
> the bottom to have triangle in counter clockwize. (the -100 in my
> version is a mistake from a test, it should be 0)
>
> hf->setOrigin(osg::Vec3(TopLeft[0],BottomLeft[1],-100));
> hf->setXInterval(geoTransform[1]); the pixel in x
> hf->setYInterval(-geoTransform[5]); the pixel in y
>
> and the x, y interval are taken from the geotransform.
>
> I imagine the original version worked but not for a georeferenced tiff
> in a arbitrary location. I can't send you the data i used to test. I
> hope there is enough
> explanation. I dont if the other part work or not i used only
> readHeightField.
>
>
> cheers
>
> struct MyFunctor {
>       // do nothing
>     void operator ()(const osg::Vec3& v1, const osg::Vec3& v2, const
> osg::Vec3& v3, bool treatVertexDataAsTemporary) {
>     }
>   };
> struct MyTriangulatorForDisplay : osg::TriangleFunctor<MyFunctor>
>   {
>     osg::ref_ptr<osg::Geometry> _geometry;
>     osg::ref_ptr<osg::Vec3Array> _vertexes;
>
>     MyTriangulatorForDisplay() {
>       _vertexes = new osg::Vec3Array;
>       _geometry = new osg::Geometry;
>       _geometry->setVertexArray(_vertexes.get());
>     }
>     void drawArrays(GLenum mode,GLint first,GLsizei count) {
>       osg::DrawArrays* primitive = new osg::DrawArrays(mode,
> _vertexes->size()+first, count);
>       _vertexes->insert(_vertexes->end(), _vertexCache.begin(),
> _vertexCache.end());
>       _geometry->addPrimitiveSet(primitive);
>     }
>     void postProcess();
>
>   };
>
>
>
>
>
> Robert Osfield wrote:
> > HI Cedric,
> >
> > Could you provide work flow which illustrates the problem you've seen
> > so I can recreate at me end.
> >
> > I don't believe your changes are wholly appropriate, and perhaps miss
> > the point of the some of the code, this code might be buggy... but
> > does have a purpose.
> >
> > Cheers,
> > Robert.
> >
> > On Dec 8, 2007 2:36 PM, Cedric Pinson <[EMAIL PROTECTED]> wrote:
> >
> >> Hi Robert,
> >> Here a patch for gdal reader, it did not take the georeference
> >> correctly. I added a diff to show you the difference. with my fix it
> >> works as expected for a tiff georeferenced.
> >>
> >>
> >> diff for info:
> >> 0a1,9
> >>  > /**
> >>  >  * Who is the original author ???
> >>  >  *
> >>  >  *
> >>  >  * Modified (2007)
> >>  >  *
> >>  >  *  Authors:
> >>  >  *  Cedric Pinson <[EMAIL PROTECTED]>
> >>  >  */
> >> 666c675
> >> <             TopLeft[1] = geoTransform[1];
> >> ---
> >>  >             TopLeft[1] = geoTransform[3];
> >> 736c745
> >> <
> >> ---
> >>  >
> >> 738,739c747,748
> >> <                         osg::notify(osg::INFO)<<"flipping"<<std::endl;
> >> <                         unsigned int copy_r = hf->getNumRows()-1;
> >> ---
> >>  >                 osg::notify(osg::INFO)<<"flipping"<<std::endl;
> >>  >                 unsigned int copy_r = hf->getNumRows()-1;
> >> 742,751c751,760
> >> <                     for(unsigned int c=0;c<hf->getNumColumns();++c)
> >> <                     {
> >> <                         float temp = hf->getHeight(c,r);
> >> <                         hf->setHeight(c,r,hf->getHeight(c,copy_r));
> >> <                         hf->setHeight(c,copy_r,temp);
> >> <                     }
> >> <                 }
> >> <                 hf->setOrigin(osg::Vec3(BottomLeft[0],-BottomLeft[1],0));
> >> <
> >> hf->setXInterval((BottomRight[0]-BottomLeft[0])/destWidth);
> >> <                 hf->setYInterval((TopLeft[1]-BottomLeft[1])/destHeight);
> >> ---
> >>  >                      for(unsigned int c=0;c<hf->getNumColumns();++c)
> >>  >                      {
> >>  >                          float temp = hf->getHeight(c,r);
> >>  >                          hf->setHeight(c,r,hf->getHeight(c,copy_r));
> >>  >                          hf->setHeight(c,copy_r,temp);
> >>  >                      }
> >>  >                 }
> >>  >                 hf->setOrigin(osg::Vec3(TopLeft[0],BottomLeft[1],-100));
> >>  >                 hf->setXInterval(geoTransform[1]);
> >>  >                 hf->setYInterval(-geoTransform[5]);
> >>
> >> Cheers
> >>
> >> --
> >> +33 (0) 6 63 20 03 56  Cedric Pinson mailto:[EMAIL PROTECTED] 
> >> http://www.plopbyte.net
> >>
> >>
> >>
> >> _______________________________________________
> >> osg-submissions mailing list
> >> [email protected]
> >> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
> >>
> >>
> >>
> > _______________________________________________
> > osg-submissions mailing list
> > [email protected]
> > http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
> >
>
> --
>
> +33 (0) 6 63 20 03 56  Cedric Pinson mailto:[EMAIL PROTECTED] 
> http://www.plopbyte.net
>
>
> _______________________________________________
> osg-submissions mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org
>
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to