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