Show
Ignore:
Timestamp:
09/09/05 13:13:40 (9 years ago)
Author:
robert
Message:

Added triangle index functor to src/osgUtil/SphereSegment.cpp for computing
the intersection between an indivual geometry and the sphere segment.

Converted the terrain in osgspheresegment to be an osg::Geometry based
drawable rather than a osg::ShapeDrawable?/osg::HeightField? one to make it
more practicle to use as a test for the new SphereSegment? intersection code.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgspheresegment/osgspheresegment.cpp

    r4510 r4512  
    88#include <osg/MatrixTransform> 
    99#include <osg/Geometry> 
     10 
     11#include <osgUtil/SmoothingVisitor> 
    1012 
    1113#include <osgDB/ReadFile> 
     
    234236        terrainGeode->setStateSet( stateset ); 
    235237 
    236         float size = 1000; // 10km; 
    237         float scale = size/39.0f; // 10km; 
    238         float z_scale = scale*3.0f; 
    239  
    240         osg::HeightField* grid = new osg::HeightField; 
    241         grid->allocate(38,39); 
    242         grid->setXInterval(scale); 
    243         grid->setYInterval(scale); 
    244  
    245         for(unsigned int r=0;r<39;++r) 
     238         
    246239        { 
    247             for(unsigned int c=0;c<38;++c) 
    248             { 
    249                 grid->setHeight(c,r,z_scale*vertex[r+c*39][2]); 
    250             } 
     240            unsigned int numColumns = 38; 
     241            unsigned int numRows = 39; 
     242            unsigned int r, c; 
     243             
     244            osg::Vec3 origin(0.0f,0.0f,0.0f); 
     245            osg::Vec3 size(1000.0f,1000.0f,250.0f); 
     246 
     247            osg::Geometry* geometry = new osg::Geometry; 
     248 
     249            osg::Vec3Array& v = *(new osg::Vec3Array(numColumns*numRows)); 
     250            osg::Vec2Array& tc = *(new osg::Vec2Array(numColumns*numRows)); 
     251            osg::Vec4ubArray& color = *(new osg::Vec4ubArray(1)); 
     252 
     253            color[0].set(255,255,255,255); 
     254 
     255            float rowCoordDelta = size.y()/(float)(numRows-1); 
     256            float columnCoordDelta = size.x()/(float)(numColumns-1); 
     257 
     258            float rowTexDelta = 1.0f/(float)(numRows-1); 
     259            float columnTexDelta = 1.0f/(float)(numColumns-1); 
     260 
     261            // compute z range of z values of grid data so we can scale it. 
     262            float min_z = FLT_MAX; 
     263            float max_z = -FLT_MAX; 
     264            for(r=0;r<numRows;++r) 
     265            { 
     266                for(c=0;c<numColumns;++c) 
     267                { 
     268                    min_z = osg::minimum(min_z,vertex[r+c*numRows][2]); 
     269                    max_z = osg::maximum(max_z,vertex[r+c*numRows][2]); 
     270                } 
     271            } 
     272 
     273            float scale_z = size.z()/(max_z-min_z); 
     274 
     275            osg::Vec3 pos = origin; 
     276            osg::Vec2 tex(0.0f,0.0f); 
     277            int vi=0; 
     278            for(r=0;r<numRows;++r) 
     279            { 
     280                pos.x() = origin.x(); 
     281                tex.x() = 0.0f; 
     282                for(c=0;c<numColumns;++c) 
     283                { 
     284                    v[vi].set(pos.x(),pos.y(),pos.z()+(vertex[r+c*numRows][2]-min_z)*scale_z); 
     285                    tc[vi] = tex; 
     286                    pos.x()+=columnCoordDelta; 
     287                    tex.x()+=columnTexDelta; 
     288                    ++vi; 
     289                } 
     290                pos.y() += rowCoordDelta; 
     291                tex.y() += rowTexDelta; 
     292            } 
     293 
     294            geometry->setVertexArray(&v); 
     295            geometry->setTexCoordArray(0, &tc); 
     296            geometry->setColorArray(&color); 
     297            geometry->setColorBinding(osg::Geometry::BIND_OVERALL); 
     298 
     299            for(r=0;r<numRows-1;++r) 
     300            { 
     301                osg::DrawElementsUShort& drawElements = *(new osg::DrawElementsUShort(GL_QUAD_STRIP,2*numColumns)); 
     302                geometry->addPrimitiveSet(&drawElements); 
     303                int ei=0; 
     304                for(c=0;c<numColumns;++c) 
     305                { 
     306                    drawElements[ei++] = (r+1)*numColumns+c; 
     307                    drawElements[ei++] = (r)*numColumns+c; 
     308                } 
     309            } 
     310             
     311            osgUtil::SmoothingVisitor smoother; 
     312            smoother.smooth(*geometry); 
     313             
     314            terrainGeode->addDrawable(geometry); 
    251315        } 
    252         terrainGeode->addDrawable(new osg::ShapeDrawable(grid)); 
    253          
    254316         
    255317    }     
     
    273335    } 
    274336 
    275     osgSim::SphereSegment::LineList lines = ss->computeIntersection(terrainGeode.get(), osg::Matrixd::identity()); 
     337    osgSim::SphereSegment::LineList lines = ss->computeIntersection(osg::Matrixd::identity(), terrainGeode.get()); 
    276338    if (!lines.empty()) 
    277339    {