gluPartialDisk в osg/osgEarth

Я пытался создать объект, подобный gluDisk openGL, в osgEarth. До сих пор я пытался сделать следующее (отредактировано, это правильный ответ):

void ViewDriver::drawCircZone(double lat, double lon, double innerRadius, double outerRadius, QColor color, double beginAngle, double endAngle){
    GeometryFactory g;
    osg::ref_ptr<osgEarth::Geometry> outerCircleGeom = g.createArc(osg::Vec3d(lat, lon, 0), convertFromMetersToMercDeg(outerRadius), beginAngle, endAngle);
    osg::ref_ptr<osgEarth::Geometry> innerCircleGeom = g.createArc(osg::Vec3d(lat, lon, 0), convertFromMetersToMercDeg(innerRadius), beginAngle, endAngle);

    osg::Vec3dArray* outerCircArray = outerCircleGeom->createVec3dArray();
    osg::Vec3dArray* innerCircArray = innerCircleGeom->createVec3dArray();

    Vec3dVector* diskVec = new Vec3dVector;

    for(int i = 0; i < outerCircArray->size() - 1; i++){
        diskVec->push_back((*outerCircArray)[i]);
    }
    //This is important for closing the shape and not giving it a Pac-Man-like mouth
    diskVec->push_back((*outerCircArray)[0]);

    //This is how you make a "hole", by iterating backwards 
    for(int i = innerCircArray->size() - 1; i >= 0; i--){
        diskVec->push_back((*innerCircArray)[i]);
    }

    osg::ref_ptr<osgEarth::Symbology::Ring> diskRing = new Ring(diskVec);
    diskRing->close();

    osg::ref_ptr<Feature> circFeature = new Feature(diskRing, view->getMapViewer()->geoSRS);

    Style circStyle;
    circStyle.getOrCreate<PolygonSymbol>()->outline() = true;
    circStyle.getOrCreate<PolygonSymbol>()->fill()->color() = Color(color.red()/255.0, color.green()/255.0, color.blue()/255.0, 1.0);
    circStyle.getOrCreate<AltitudeSymbol>()->clamping() = AltitudeSymbol::CLAMP_RELATIVE_TO_TERRAIN;
    circStyle.getOrCreate<AltitudeSymbol>()->technique() = AltitudeSymbol::TECHNIQUE_DRAPE;

    osg::ref_ptr<FeatureNode> circNode = new FeatureNode(circFeature, circStyle);
    circNode->setDynamic(true);

    view->getMapNode()->addChild(circNode);
}

Что меня изначально озадачило, так это то, что у меня не так много знаний в области графики. Где-то я читал, что рисуя контуры, делайте это по часовой стрелке. При рисовании контуров в направлении против часовой стрелки они будут «вырезать» или создавать «отверстие» в сочетании с точками, нарисованными по часовой стрелке. Первоначально я заполнял контур «отверстия» точкой меньшего круга по часовой стрелке при тестировании этого метода, поэтому он не работал.


person Blanky    schedule 27.09.2018    source источник
comment
Опубликуйте хотя бы полную функцию createDisk   -  person Nadir    schedule 27.09.2018
comment
почему вы устанавливаете координату Z на 100 при копировании вершин внутреннего диска?   -  person Nadir    schedule 28.09.2018
comment
Иногда, если я пытаюсь нарисовать фигуру с z = 0, происходит отсечение с рельефом карты, и фигура скрывается под землей, даже когда я устанавливаю стиль «Привязать к высоте местности», я не уверен, почему это происходит. Я забыл отредактировать, что я также делаю это для геометрии внутреннего и внешнего круга. Я добавлю всю функцию теперь, когда я действительно могу копировать и вставлять ее.   -  person Blanky    schedule 28.09.2018