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