三维控件SceneControl类新增定位到模型图层函数接口

master
cbwu 2 years ago
parent 50bd3efe6a
commit caf411a01f

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 11.0.0, 2023-07-29T11:34:19. --> <!-- Written by QtCreator 11.0.0, 2023-08-03T09:10:46. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>

@ -107,6 +107,10 @@
//#include "FileParser/UGFileParserTile.h" //#include "FileParser/UGFileParserTile.h"
//#include "FileParser/UGSimpleConfigParams.h" //#include "FileParser/UGSimpleConfigParams.h"
//#include "FileParser/UGFileParseVector.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" #include "Symbol/UGMarkerSymbolLib.h"
@ -834,7 +838,7 @@ void MainWindow::addMapConnect()
//连接信号actionTransformMap与槽transformMap //连接信号actionTransformMap与槽transformMap
connect(actionTransformMap,&QAction::triggered,this,&MainWindow::transformMap); connect(actionTransformMap,&QAction::triggered,this,&MainWindow::transformMap);
//连接信号actionTransformMap与ImportSceneDataDialog对话框 //连接信号actionImportData与ImportSceneDataDialog对话框
connect(actionImportData,&QAction::triggered,this,[&](){ connect(actionImportData,&QAction::triggered,this,[&](){
ImportSceneDataDialog importSceneDataDlg; ImportSceneDataDialog importSceneDataDlg;
connect(&importSceneDataDlg,&ImportSceneDataDialog::sendSceneDataPath,this,&MainWindow::importSceneData); connect(&importSceneDataDlg,&ImportSceneDataDialog::sendSceneDataPath,this,&MainWindow::importSceneData);
@ -1395,7 +1399,10 @@ void MainWindow::loadModelData()
//// pSceneControl->GetSceneEditWnd()->SetUserAction(UGEditType3D::ET3D_PolyLine,UGSceneUserAction::suaCreatePolyline); //// 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); // pSceneControl->ViewToLayer(planeLayer);
// UGCameraWorld* cameraGb = pSceneControl->GetCameraWorld(); // UGCameraWorld* cameraGb = pSceneControl->GetCameraWorld();
// std::set< UGint > setObjsVisible; // std::set< UGint > setObjsVisible;
@ -1557,7 +1564,6 @@ void MainWindow::loadModelData()
// layers->SetEditableLayer(modelLayer3D,true); // layers->SetEditableLayer(modelLayer3D,true);
// modelLayer3D->SetStyle3D(style3D); // modelLayer3D->SetStyle3D(style3D);
// UGPlottingLayer3D* plotLayer = new UGPlottingLayer3D();
// UGLayer3D* kmlLayer = pSceneControl->AddLayerFromFile("E:/a.kml"); // UGLayer3D* kmlLayer = pSceneControl->AddLayerFromFile("E:/a.kml");
// kmlLayer->SetSelectable(false); // kmlLayer->SetSelectable(false);
// kmlLayer->SetEditable(true); // kmlLayer->SetEditable(true);
@ -1988,13 +1994,13 @@ void MainWindow::importSceneData(QStringList imagePathList, QStringList terrainP
// pSceneControl->GetCameraWorld()->PitchCamera(UGMathEngine::DegreesToRadians(80)); // pSceneControl->GetCameraWorld()->PitchCamera(UGMathEngine::DegreesToRadians(80));
// UGCameraGlobal* cgb = (UGCameraGlobal*)pScene->GetCamera(_U("Camera")); // UGCameraGlobal* cgb = (UGCameraGlobal*)pScene->GetCamera(_U("Camera"));
UGRect2D bounds = pScene->m_Layers.GetLayerInnerAt(0)->GetBounds(); // UGRect2D bounds = pScene->m_Layers.GetLayerInnerAt(0)->GetBounds();
double lon_la = UGMathEngine::DegreesToRadians(bounds.left); // double lon_la = UGMathEngine::DegreesToRadians(bounds.left);
double lat_la = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2); // double lat_la = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2);
double lon_cb = UGMathEngine::DegreesToRadians(bounds.left+bounds.Width()/2); // double lon_cb = UGMathEngine::DegreesToRadians(bounds.left+bounds.Width()/2);
double lat_cb = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2); // double lat_cb = UGMathEngine::DegreesToRadians(bounds.bottom + bounds.Height()/2);
qDebug()<<"******************Distance:"<<UGMathEngine::SphericalDistance(lon_la,lat_la,lon_cb,lat_cb); // qDebug()<<"******************Distance:"<<UGMathEngine::SphericalDistance(lon_la,lat_la,lon_cb,lat_cb);
qDebug()<<"******************DistanceCos:"<<UGMathEngine::SphericalDistanceCos(lon_la,lat_la,lon_cb,lat_cb); // qDebug()<<"******************DistanceCos:"<<UGMathEngine::SphericalDistanceCos(lon_la,lat_la,lon_cb,lat_cb);
} }
// UGCameraLocal* cgb = (UGCameraLocal*)pScene->GetCamera(_U("Camera")); // UGCameraLocal* cgb = (UGCameraLocal*)pScene->GetCamera(_U("Camera"));
@ -2250,10 +2256,10 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
if(rMenuType==RBtnMenuType::DefaultMenu && mapType == MapType::Map3D) if(rMenuType==RBtnMenuType::DefaultMenu && mapType == MapType::Map3D)
{ {
/*
UGCameraWorld* camera = pSceneControl->GetScene3D()->GetCamera(_U("Camera")); UGCameraWorld* camera = pSceneControl->GetScene3D()->GetCamera(_U("Camera"));
UGCameraState cs = camera->m_StateCamera; UGCameraState cs = camera->m_StateCamera;
pSceneControl->GetCameraWorld()->GetCamera(cs); // pSceneControl->GetCameraWorld()->GetCamera(cs);
qDebug()<<"*************lat:"<<cs.dLat*180/PI; qDebug()<<"*************lat:"<<cs.dLat*180/PI;
qDebug()<<"*************lon:"<<cs.dLon*180/PI; qDebug()<<"*************lon:"<<cs.dLon*180/PI;
qDebug()<<"*************Distance:"<<cs.dDistance; qDebug()<<"*************Distance:"<<cs.dDistance;
@ -2271,18 +2277,18 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
qDebug()<<"*************Roll1:"<<cs1.dRoll*180/PI; qDebug()<<"*************Roll1:"<<cs1.dRoll*180/PI;
qDebug()<<"*************Tilt1:"<<cs1.dTilt*180/PI; qDebug()<<"*************Tilt1:"<<cs1.dTilt*180/PI;
UGVector3d vPos; // UGVector3d vPos;
UGQuaternion4d q; // UGQuaternion4d q;
UGCameraWorld::PosAndOrientation2CameraState(vPos,q,cs); // UGCameraWorld::PosAndOrientation2CameraState(vPos,q,cs);
qDebug()<<"*************vPos.x:"<<vPos.x; // qDebug()<<"*************vPos.x:"<<vPos.x;
qDebug()<<"*************vPos.y:"<<vPos.y; // qDebug()<<"*************vPos.y:"<<vPos.y;
qDebug()<<"*************vPos.z:"<<vPos.z; // qDebug()<<"*************vPos.z:"<<vPos.z;
qDebug()<<"*************q.x:"<<q.x; // qDebug()<<"*************q.x:"<<q.x;
qDebug()<<"*************q.y:"<<q.y; // qDebug()<<"*************q.y:"<<q.y;
qDebug()<<"*************q.z:"<<q.z; // qDebug()<<"*************q.z:"<<q.z;
qDebug()<<"*************q.w:"<<q.w; // qDebug()<<"*************q.w:"<<q.w;
*/
// if(pSceneControl->GetSceneEditWnd()->GetUserAction() != 105) return; // if(pSceneControl->GetSceneEditWnd()->GetUserAction() != 105) return;
@ -2305,6 +2311,7 @@ void MainWindow::startReceiveRealTimePositionInfoThread()
receiveRealTimePositionInfoTask->moveToThread(receiveRealTimePositionInfoThread); receiveRealTimePositionInfoTask->moveToThread(receiveRealTimePositionInfoThread);
receiveRealTimePositionInfoThread->start(); receiveRealTimePositionInfoThread->start();
} }
//关闭接收实时位置数据总线程 //关闭接收实时位置数据总线程
void MainWindow::closeReceiveRealTimePositionInfoThread() void MainWindow::closeReceiveRealTimePositionInfoThread()
{ {
@ -2332,6 +2339,7 @@ void MainWindow::startCollisionDetectThread(int ms)
emit startCollisionDetect(ms); emit startCollisionDetect(ms);
} }
//关闭碰撞检测子线程 //关闭碰撞检测子线程
void MainWindow::closeCollisionDetectThread() void MainWindow::closeCollisionDetectThread()
{ {
@ -2349,55 +2357,14 @@ void MainWindow::closeCollisionDetectThread()
//********用于测试************* //********用于测试*************
void MainWindow::test() void MainWindow::test()
{ {
/* UGLayer3D* layer3D = pSceneControl->GetSceneEditWnd()->GetScene3D()->m_Layers.AddLayer(_U("大陆机场18@Route"));
QTimer* sendData = new QTimer; // pSceneControl->ViewToLayer(layer3D);
sendData->setInterval(200); loadModelData();
// QPointF pt;
pt.setX(119.668);
pt.setY(32.23);
// QList<double> 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:"<<lon.takeLast();
// qDebug()<<"***************lat:"<<lat.takeLast();
// qDebug()<<"***************heading:"<<heading.takeLast();
// qDebug()<<"*********************************";
emit sendPositionData1(lon,lat,heading);
});
*/
/*地形碰撞检测
testFlag = !testFlag; testFlag = !testFlag;
qDebug()<<"*******************:"<<testFlag; qDebug()<<"*******************:"<<testFlag;
qDebug() << "MainThread address: " << QThread::currentThread(); qDebug() << "MainThread address: " << QThread::currentThread();
/*
receiveRealTimePositionInfoThread = new QThread;
receiveRealTimePositionInfoTask = new RealTimePositionInfoThread;
receiveRealTimePositionInfoTask->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(); startReceiveRealTimePositionInfoThread();
@ -2426,16 +2393,12 @@ void MainWindow::test()
startCollisionDetectThread(1000); startCollisionDetectThread(1000);
} }
m_pShowPlane->startFly(); m_pShowPlane->startFly();
// receiveRealTimePositionInfoThread->start();
// receiveRealTimePositionInfoTask->start();
// receiveRealTimePositionInfoTask->working();
// QThread::msleep(1000);
// emit stopGenerate();
// sendDataThread->quit();
if(!testFlag) emit testEnd(); if(!testFlag) emit testEnd();
*/
} }
//气泡消息通知
void MainWindow::showNotify(QString title, QString body, QVariantMap data) void MainWindow::showNotify(QString title, QString body, QVariantMap data)
{ {
notifyManager->notify(title,body,data); notifyManager->notify(title,body,data);
@ -2532,6 +2495,24 @@ void MainWindow::viewEntire()
//平移浏览地图操作 //平移浏览地图操作
void MainWindow::pan() 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; // QVariantMap data;
// data["icon"] = ":/Resources/WarningLevel1.png"; // 自定义消息图标也可传入QPixmap // data["icon"] = ":/Resources/WarningLevel1.png"; // 自定义消息图标也可传入QPixmap
// notifyManager->notify("新消息","消息主体",data); // notifyManager->notify("新消息","消息主体",data);

@ -42,6 +42,7 @@ namespace UGC
// class UGMapEditorWnd; // class UGMapEditorWnd;
} }
using namespace UGC; using namespace UGC;
using namespace std;
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }

@ -10,6 +10,7 @@
#include "Base/OgdcPoint3D.h" #include "Base/OgdcPoint3D.h"
#include "Base3D/UGMathEngine.h" #include "Base3D/UGMathEngine.h"
#include "geofeatureoperator.h" #include "geofeatureoperator.h"
#include "Geometry3D/UGGeoModelPro.h"
//using namespace SuperMap; //using namespace SuperMap;
@ -91,7 +92,7 @@ void SceneControl::Initialize(void* pWndHandle, int dpiX, int dpiY)
ChinaState.dLat= UGMathEngine::DegreesToRadians(33); ChinaState.dLat= UGMathEngine::DegreesToRadians(33);
ChinaState.dHeading = 0; ChinaState.dHeading = 0;
ChinaState.dTilt=0; ChinaState.dTilt=0;
ChinaState.dAltitude=11269380; ChinaState.dAltitude=11269.38*1000;
m_pCameraWorld->SetCamera(ChinaState); m_pCameraWorld->SetCamera(ChinaState);
pScene->GetRenderTarget()->AddViewport(m_pCameraWorld, 0); pScene->GetRenderTarget()->AddViewport(m_pCameraWorld, 0);
m_pRoot3D->SetActiveScene(pScene); m_pRoot3D->SetActiveScene(pScene);
@ -772,16 +773,54 @@ UGRecordsetPtr SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEdita
void SceneControl::ViewToLayer(UGLayer3D* pLayer) 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) if (pLayer != NULL)
{ {
// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->SetInteria(true,0.5,0.5); m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyToBounds(pLayer->GetBounds(), 6000);
m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyToBounds(pLayer->GetBounds(), 8000); // m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyToCamera(state,7000);
// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->SetEyeTilt(UGMathEngine::DegreesToRadians(80)); // m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->FlyTo(lookatstate,7000);
// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->PitchCamera(UGMathEngine::DegreesToRadians(80)); // m_pCameraWorld->m_StateLookAt.dLon = state.dLon;
// m_pUGSceneWnd->GetScene3D()->GetCamera(_U("Camera"))->Pitch(UGMathEngine::DegreesToRadians(80)); // 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() void SceneControl::Close()
{ {
m_pUGSceneWnd->GetScene3D()->Reset(); m_pUGSceneWnd->GetScene3D()->Reset();

@ -1,4 +1,4 @@
/* /*
* Author: Jun0x01@github.com * Author: Jun0x01@github.com
* Date: 2019.04.08 * Date: 2019.04.08
*/ */
@ -299,6 +299,12 @@ using namespace UGC;
// 全幅显示指定图层 // 全幅显示指定图层
void ViewToLayer(UGLayer3D* pLayer); void ViewToLayer(UGLayer3D* pLayer);
/*
*@cbwu
*@brief
*@pModelLayer
*/
void ViewToModelLayer(UGLayer3D* pModelLayer,long nMillSec=7000);
// 关闭场景 // 关闭场景
void Close(); void Close();

Loading…
Cancel
Save