From caf411a01f23189c4609f71d22b361f69c02b672 Mon Sep 17 00:00:00 2001 From: cbwu Date: Thu, 3 Aug 2023 11:12:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=89=E7=BB=B4=E6=8E=A7=E4=BB=B6SceneContro?= =?UTF-8?q?l=E7=B1=BB=E6=96=B0=E5=A2=9E=E5=AE=9A=E4=BD=8D=E5=88=B0?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=9B=BE=E5=B1=82=E5=87=BD=E6=95=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MapDisplay.pro.user | 2 +- mainwindow.cpp | 131 +++++++++++++++++++------------------------- mainwindow.h | 1 + scenecontrol.cpp | 51 +++++++++++++++-- scenecontrol.h | 8 ++- 5 files changed, 110 insertions(+), 83 deletions(-) diff --git a/MapDisplay.pro.user b/MapDisplay.pro.user index e6dc5738..8c8c35b2 100644 --- a/MapDisplay.pro.user +++ b/MapDisplay.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/mainwindow.cpp b/mainwindow.cpp index 5a61f1ce..3c8cee5d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -107,6 +107,10 @@ //#include "FileParser/UGFileParserTile.h" //#include "FileParser/UGSimpleConfigParams.h" //#include "FileParser/UGFileParseVector.h" +//#include "private/Layer3DTree/UGKmlContainerSeal.h" +//#include "private/Layer3DTree/UGLayer3DTree.h" +//#include "private/Layer3DGML/UGLayer3DGML.h" +#include "private/Layer3DDatasetModel/UGLayer3DDatasetModelPro.h" #include "Symbol/UGMarkerSymbolLib.h" @@ -834,7 +838,7 @@ void MainWindow::addMapConnect() //连接信号actionTransformMap与槽transformMap connect(actionTransformMap,&QAction::triggered,this,&MainWindow::transformMap); - //连接信号actionTransformMap与ImportSceneDataDialog对话框 + //连接信号actionImportData与ImportSceneDataDialog对话框 connect(actionImportData,&QAction::triggered,this,[&](){ ImportSceneDataDialog importSceneDataDlg; connect(&importSceneDataDlg,&ImportSceneDataDialog::sendSceneDataPath,this,&MainWindow::importSceneData); @@ -1395,7 +1399,10 @@ void MainWindow::loadModelData() //// pSceneControl->GetSceneEditWnd()->SetUserAction(UGEditType3D::ET3D_PolyLine,UGSceneUserAction::suaCreatePolyline); -// UGLayer3D* planeLayer = pSceneControl->GetUGLayer3Ds()->AddLayer(_U("Plane@Route")); // + UGLayer3D* planeLayer = pSceneControl->GetUGLayer3Ds()->AddLayer(_U("Plane@Route")); + pSceneControl->ViewToModelLayer(planeLayer); + + // pSceneControl->ViewToLayer(planeLayer); // UGCameraWorld* cameraGb = pSceneControl->GetCameraWorld(); // std::set< UGint > setObjsVisible; @@ -1557,7 +1564,6 @@ void MainWindow::loadModelData() // layers->SetEditableLayer(modelLayer3D,true); // modelLayer3D->SetStyle3D(style3D); -// UGPlottingLayer3D* plotLayer = new UGPlottingLayer3D(); // UGLayer3D* kmlLayer = pSceneControl->AddLayerFromFile("E:/a.kml"); // kmlLayer->SetSelectable(false); // kmlLayer->SetEditable(true); @@ -1988,13 +1994,13 @@ void MainWindow::importSceneData(QStringList imagePathList, QStringList terrainP // pSceneControl->GetCameraWorld()->PitchCamera(UGMathEngine::DegreesToRadians(80)); // UGCameraGlobal* cgb = (UGCameraGlobal*)pScene->GetCamera(_U("Camera")); - UGRect2D bounds = pScene->m_Layers.GetLayerInnerAt(0)->GetBounds(); - double lon_la = UGMathEngine::DegreesToRadians(bounds.left); - double lat_la = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2); - double lon_cb = UGMathEngine::DegreesToRadians(bounds.left+bounds.Width()/2); - double lat_cb = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2); - qDebug()<<"******************Distance:"<m_Layers.GetLayerInnerAt(0)->GetBounds(); +// double lon_la = UGMathEngine::DegreesToRadians(bounds.left); +// double lat_la = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2); +// double lon_cb = UGMathEngine::DegreesToRadians(bounds.left+bounds.Width()/2); +// double lat_cb = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2); +// qDebug()<<"******************Distance:"<GetCamera(_U("Camera")); @@ -2250,10 +2256,10 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event) if(rMenuType==RBtnMenuType::DefaultMenu && mapType == MapType::Map3D) { - /* + UGCameraWorld* camera = pSceneControl->GetScene3D()->GetCamera(_U("Camera")); UGCameraState cs = camera->m_StateCamera; - pSceneControl->GetCameraWorld()->GetCamera(cs); +// pSceneControl->GetCameraWorld()->GetCamera(cs); qDebug()<<"*************lat:"<GetSceneEditWnd()->GetUserAction() != 105) return; @@ -2305,6 +2311,7 @@ void MainWindow::startReceiveRealTimePositionInfoThread() receiveRealTimePositionInfoTask->moveToThread(receiveRealTimePositionInfoThread); receiveRealTimePositionInfoThread->start(); } + //关闭接收实时位置数据总线程 void MainWindow::closeReceiveRealTimePositionInfoThread() { @@ -2332,6 +2339,7 @@ void MainWindow::startCollisionDetectThread(int ms) emit startCollisionDetect(ms); } + //关闭碰撞检测子线程 void MainWindow::closeCollisionDetectThread() { @@ -2349,55 +2357,14 @@ void MainWindow::closeCollisionDetectThread() //********用于测试************* void MainWindow::test() { - /* - QTimer* sendData = new QTimer; - sendData->setInterval(200); -// QPointF pt; - pt.setX(119.668); - pt.setY(32.23); -// QList lon, lat, heading,speed,relativeAlititude; -// GeoComputation geoComputation; - connect(sendData,&QTimer::timeout,this,[=](){ -// qDebug()<<"***************TimeOut:"; - // int i = 0; - lon.clear(); - lat.clear(); - heading.clear(); - speed.clear(); - relativeAlititude.clear(); - pt = geoComputation.getDestinationPoint(pt.x(),pt.y(),90,4); - lon.append(pt.x()); - lat.append(pt.y()); - heading.append(90); - speed.append(20); - relativeAlititude.append(50); -// qDebug()<<"***************lon:"<GetSceneEditWnd()->GetScene3D()->m_Layers.AddLayer(_U("大陆机场18@Route")); +// pSceneControl->ViewToLayer(layer3D); + loadModelData(); + /*地形碰撞检测 testFlag = !testFlag; - qDebug()<<"*******************:"<moveToThread(receiveRealTimePositionInfoThread); - receiveRealTimePositionInfoThread->start(); - - collisionThread = new QThread; - collisionDetectionTask = new CollisionDetectionThread(qMapControl); - collisionDetectionTask->moveToThread(collisionThread); - collisionThread->start(); - connect(collisionDetectionTask,&CollisionDetectionThread::showNotify,this,&MainWindow::showNotify); - connect(collisionDetectionTask,&CollisionDetectionThread::requestPositionInfo,receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::startSendCollisionDetectionPosInfo); - connect(this,&MainWindow::startCollisionDetect,collisionDetectionTask,&CollisionDetectionThread::start); - connect(receiveRealTimePositionInfoTask,&RealTimePositionInfoThread::sendCollisionDetectPosInfo,collisionDetectionTask,&CollisionDetectionThread::receiveLocationData); - */ startReceiveRealTimePositionInfoThread(); @@ -2426,16 +2393,12 @@ void MainWindow::test() startCollisionDetectThread(1000); } m_pShowPlane->startFly(); -// receiveRealTimePositionInfoThread->start(); -// receiveRealTimePositionInfoTask->start(); -// receiveRealTimePositionInfoTask->working(); -// QThread::msleep(1000); -// emit stopGenerate(); -// sendDataThread->quit(); if(!testFlag) emit testEnd(); + */ } +//气泡消息通知 void MainWindow::showNotify(QString title, QString body, QVariantMap data) { notifyManager->notify(title,body,data); @@ -2532,6 +2495,24 @@ void MainWindow::viewEntire() //平移浏览地图操作 void MainWindow::pan() { +// UGCameraState state = pSceneControl->GetCameraWorld()->m_StateCamera; +// state.dLon = UGMathEngine::Degree2Radian(state.dLon*180/PI+0.001); +// state.dHeading = UGMathEngine::Degree2Radian(state.dHeading*180/PI+1); +// pSceneControl->GetCameraWorld()->SetCamera(state); +// UGCameraState lookatstate; +// lookatstate.dLon = UGMathEngine::Degree2Radian(119.715); +// lookatstate.dLat = UGMathEngine::Degree2Radian(32.2336); +// pSceneControl->GetCameraWorld()->SetLookAt(lookatstate); +// pSceneControl->GetCameraWorld()->m_StateLookAt.dLon = state.dLon; +// pSceneControl->GetCameraWorld()->m_StateLookAt.dLat = state.dLat; + UGCameraState lookatstate = pSceneControl->GetCameraWorld()->m_StateLookAt; + lookatstate.dLon = UGMathEngine::Degree2Radian(119.715); + lookatstate.dLat = UGMathEngine::Degree2Radian(32.2336); +// lookatstate.dAltitude = 0; +// lookatstate.dHeading = 0; +// lookatstate.dTilt = UGMathEngine::Degree2Radian(60); + pSceneControl->GetCameraWorld()->SetLookAt(lookatstate); + // QVariantMap data; // data["icon"] = ":/Resources/WarningLevel1.png"; // 自定义消息图标,也可传入QPixmap // notifyManager->notify("新消息","消息主体",data); diff --git a/mainwindow.h b/mainwindow.h index 9ebb73b7..145a3f5d 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -42,6 +42,7 @@ namespace UGC // class UGMapEditorWnd; } using namespace UGC; +using namespace std; QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } diff --git a/scenecontrol.cpp b/scenecontrol.cpp index 27acca34..8b442f3d 100644 --- a/scenecontrol.cpp +++ b/scenecontrol.cpp @@ -10,6 +10,7 @@ #include "Base/OgdcPoint3D.h" #include "Base3D/UGMathEngine.h" #include "geofeatureoperator.h" +#include "Geometry3D/UGGeoModelPro.h" //using namespace SuperMap; @@ -91,7 +92,7 @@ void SceneControl::Initialize(void* pWndHandle, int dpiX, int dpiY) ChinaState.dLat= UGMathEngine::DegreesToRadians(33); ChinaState.dHeading = 0; ChinaState.dTilt=0; - ChinaState.dAltitude=11269380; + ChinaState.dAltitude=11269.38*1000; m_pCameraWorld->SetCamera(ChinaState); pScene->GetRenderTarget()->AddViewport(m_pCameraWorld, 0); m_pRoot3D->SetActiveScene(pScene); @@ -772,16 +773,54 @@ UGRecordsetPtr SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEdita void SceneControl::ViewToLayer(UGLayer3D* pLayer) { +// UGRect2D bounds = pLayer->GetBounds(); +// UGCameraState state; +// state.dLon = UGMathEngine::DegreesToRadians(bounds.CenterPoint().x); +// state.dLat = UGMathEngine::DegreesToRadians(bounds.CenterPoint().y); +// state.dAltitude = 0; +// state.dDistance = 5.4*1000; +// state.dHeading = 0; +// state.dTilt = UGMathEngine::DegreesToRadians(60); //UGMathEngine::DegreesToRadians(60) +// UGCameraState lookatstate = state; +// lookatstate.dTilt = 0; if (pLayer != NULL) { -// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->SetInteria(true,0.5,0.5); - m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyToBounds(pLayer->GetBounds(), 8000); -// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->SetEyeTilt(UGMathEngine::DegreesToRadians(80)); -// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->PitchCamera(UGMathEngine::DegreesToRadians(80)); -// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->Pitch(UGMathEngine::DegreesToRadians(80)); + m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyToBounds(pLayer->GetBounds(), 6000); +// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyToCamera(state,7000); +// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyTo(lookatstate,7000); +// m_pCameraWorld->m_StateLookAt.dLon = state.dLon; +// m_pCameraWorld->m_StateLookAt.dLat = state.dLat; +// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->SetLookAt(lookatstate); } } +//定位到模型图层 +void SceneControl::ViewToModelLayer(UGLayer3D *pModelLayer,long nMillSec) +{ + //获取模型位置 + UGDatasetVector* dv = (UGDatasetVector*)pModelLayer->GetAttachData(); + dv->Open(); + UGQueryDef queryDef; + UGRecordsetPtr res = dv->Query(queryDef); + UGGeometry* geometry = NULL; + res->GetGeometry(geometry); + UGGeoModelPro* model = (UGGeoModelPro*)geometry; + UGPoint3D pt3D = model->GetPosition(); + //设置相机LookAt + UGCameraState lookatstate; + lookatstate.dLon = UGMathEngine::DegreesToRadians(pt3D.x); + lookatstate.dLat = UGMathEngine::DegreesToRadians(pt3D.y); + lookatstate.dAltitude = pt3D.z; + lookatstate.dDistance = pt3D.z*2.2; + lookatstate.dHeading = 0; + lookatstate.dTilt = UGMathEngine::DegreesToRadians(85); + //飞行到模型位置 + m_pCameraWorld->FlyTo(lookatstate,nMillSec); + + geometry = NULL; + model = NULL; +} + void SceneControl::Close() { m_pUGSceneWnd->GetScene3D()->Reset(); diff --git a/scenecontrol.h b/scenecontrol.h index abfb0f0f..b5c2d904 100644 --- a/scenecontrol.h +++ b/scenecontrol.h @@ -1,4 +1,4 @@ -/* +/* * Author: Jun0x01@github.com * Date: 2019.04.08 */ @@ -299,6 +299,12 @@ using namespace UGC; // 全幅显示指定图层 void ViewToLayer(UGLayer3D* pLayer); + /* + *@cbwu + *@brief 定位到模型 + *@pModelLayer 模型图层 + */ + void ViewToModelLayer(UGLayer3D* pModelLayer,long nMillSec=7000); // 关闭场景 void Close();