C++三维场景中添加广告牌显示图片问题

0 投票

需求描述:需要实现在三维场景中添加广告牌显示的功能,用于实现图片的显示。
解决思路:准备采用超图底层的广告牌UGGeoBillboard来实现,已经在Extensions4Qt工程下的layer3d.cpp中写了一个AddPicture的接口,也在GettingStarted的mainwindow.cpp中的CreateModel中调用了。
当前状态:广告牌对象创建返回false。

Feature3D *Layer3D::AddPicture(QString &pictureFile,OgdcPoint3D &position,QString &strID)
{
    //!新建图片对象
    UGGeoPicture* pPicture = new UGGeoPicture();
    QImage* pImage = new QImage(pictureFile);
    UGImageData* pImageData = new UGImageData();
    pImageData->nHeight = pImage->height();
    pImageData->nWidth = pImage->width();
    pImageData->nWidthBytes = pImage->bytesPerLine();
    pImageData->btBitsPixel = 32;
    pImageData->pBits = new UGbyte[pImage->byteCount()];
    memcpy(pImageData->pBits,pImage->bits(),pImage->byteCount());

    UGArray<UGImageData*> arrImageData;
    arrImageData.Add(pImageData);

    UGPoint2D pntCenter(position.x,position.y);
    //返回true
    bool bIsOk = pPicture->Make(arrImageData,pntCenter,UGSize2D(pImage->width(),pImage->height()));
    //! 新建布告板对象
    UGGeoBillboard *pUGGeoBillboard = new UGGeoBillboard();
    //返回false
    bIsOk=pUGGeoBillboard->MakeWithGeometry(pPicture);

    pUGGeoBillboard->SetHeight(72);
    pUGGeoBillboard->SetWidth(48);
    if(bIsOk)
    {
        pUGGeoBillboard->SetPosition(position);
        return this->AddFeature(pUGGeoBillboard,strID);
    }
    else
        return NULL;
}

3月 11 分类:  116次浏览 | 用户: nuaa_li 初出茅庐 (30 分)

1个回答

0 投票
确认了一下,目前布告板只支持GeoPicture3D,不能用UGGeoPicture,需要添加三维对象。你替换一下
3月 12 用户: 程逸诗 名扬四海 (4,342 分)
我是c++组件开发,在最新版本的10.1.1中的include/Geometry3D/下找了,没有找到你说的GeoPicture3D的三维对象,但是在你们的java和net组件开发帮助中找到这个类的描述,是说明这个对象只在java和net版本才支持吗?c++中怎么用?
GeoPicture3D在这个路径下include\private\SRGeometry3D

谢谢,找到了这个对象。但是当我把c++组件升级到10.1.1后发现,我的工程连基本的地图加载都直接崩溃(工程在9d版本下正常加载运行,同时10.1.1自带的gettingStarted工程也正常加载),调试模式发现,程序停在openMap中的

if(pWorkspace->Open(Translator::QStr2UGStr(qStrPath)))

调试函数栈最终卡在

UGC::CppSQLite3DB::open()

可以确定是调用sqlite3库调用的问题。通过与正常运行的示例(2D)版本对比,发现我的工程(3D)依赖的库中除了有libsqlite3.so提供sqlite3_open之外,还额外多出了一个libsqlite3_udbx.so,也提供了sqlite3_open接口。(该库被libSuToolKit3D.so-->libSuRender.so依赖。)

这个问题该怎么解决?

上述问题已经解决,通过在gettingStarted.pro中去掉libSuRender,使得链接时先链接libsqlite3.so,然后再链接libsqlite3_udbx.so,即可实现地图加载。

但是,GeoPicture3D这个对象是属于哪个动态库呢,现在提示:

../debug/x64/libExtensions4Qt.so: undefined reference to `GeoPicture3D::FromImageFile(OGDC::OgdcUnicodeString&)'
../debug/x64/libExtensions4Qt.so: undefined reference to `GeoPicture3D::SetHeight(double)'
../debug/x64/libExtensions4Qt.so: undefined reference to `GeoPicture3D::GeoPicture3D()'
../debug/x64/libExtensions4Qt.so: undefined reference to `GeoPicture3D::SetWidth(double)'

我搜索了bin目录下的所有文件,未找到包含GeoPicture3D的so库。

iobjects_cpp/bin/bin$ find ./ -type f | xargs grep -l 'GeoPicture3D'
grep: ./fonts/WenQuanyi: 没有那个文件或目录
grep: Micro: 没有那个文件或目录
grep: Hei.ttf: 没有那个文件或目录
grep: ./Resource/MGMapData/ProjCoorSys/WGS: 没有那个文件或目录
grep: 1984.xml: 没有那个文件或目录
grep: ./Resource/MGMapData/TileTransfer/GoogleTile_SqlietToMongoDB/Scale_Web: 没有那个文件或目录
grep: Mercator.txt: 没有那个文件或目录
grep: ./Resource/MGMapData/TileTransfer/GoogleTile_SqlietToMongoDB/mongoDB.metadatas_Web: 没有那个文件或目录
grep: Mercator.json: 没有那个文件或目录

但是,搜索GeoPicture时,是有内容的:

iobjects_cpp/bin/bin$ find ./ -type f | xargs grep -l 'GeoPicture'
./libSuGeometryCAD.so
./libSuGraphics3D.so
./libSuFileParserBitMap.so
./libSuSymbolExchange.sse
grep: ./fonts/WenQuanyi: 没有那个文件或目录
grep: Micro: 没有那个文件或目录
grep: Hei.ttf: 没有那个文件或目录
./libSuDrawing3D.dwi
./libSuGeometryPlot.so
./libSuGeometry.so
./libSuFileParserBitMap.fps
./libSuFileParserGDAL.so
./libSuCacheBuilder.so
./libSuMap.so
./libSuGeometry3D.so
./libSuFileParserEGC.so
./libSuGeometry3D.geo
./libSuFileParserGDAL.fps
./libSuGeometryLayout.so
./libSuGeometryCAD.geo
./libSuDrawing.so
./libSuFileParserRAW.so
./libSuGeometryLayout.geo
grep: ./Resource/MGMapData/ProjCoorSys/WGS: 没有那个文件或目录
grep: 1984.xml: 没有那个文件或目录
grep: ./Resource/MGMapData/TileTransfer/GoogleTile_SqlietToMongoDB/Scale_Web: 没有那个文件或目录
grep: Mercator.txt: 没有那个文件或目录
grep: ./Resource/MGMapData/TileTransfer/GoogleTile_SqlietToMongoDB/mongoDB.metadatas_Web: 没有那个文件或目录
grep: Mercator.json: 没有那个文件或目录
./libSuDrawing3D.so
./libSuFileParserRAW.fps
./libSuFileParser.so
./libSuLayoutEditor.so
./libSuFileParserTEMS.fps
./libSuGeometryPlot.geo
./libSuFileParserEGC.fps

请问,怎么在链接时找到它的对应库文件呢,谢谢。

...