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

master
cbwu 2 years ago
parent 50bd3efe6a
commit caf411a01f

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<data>
<variable>EnvironmentId</variable>

@ -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:"<<UGMathEngine::SphericalDistance(lon_la,lat_la,lon_cb,lat_cb);
qDebug()<<"******************DistanceCos:"<<UGMathEngine::SphericalDistanceCos(lon_la,lat_la,lon_cb,lat_cb);
// 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:"<<UGMathEngine::SphericalDistance(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"));
@ -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:"<<cs.dLat*180/PI;
qDebug()<<"*************lon:"<<cs.dLon*180/PI;
qDebug()<<"*************Distance:"<<cs.dDistance;
@ -2271,18 +2277,18 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
qDebug()<<"*************Roll1:"<<cs1.dRoll*180/PI;
qDebug()<<"*************Tilt1:"<<cs1.dTilt*180/PI;
UGVector3d vPos;
UGQuaternion4d q;
UGCameraWorld::PosAndOrientation2CameraState(vPos,q,cs);
qDebug()<<"*************vPos.x:"<<vPos.x;
qDebug()<<"*************vPos.y:"<<vPos.y;
qDebug()<<"*************vPos.z:"<<vPos.z;
qDebug()<<"*************q.x:"<<q.x;
qDebug()<<"*************q.y:"<<q.y;
qDebug()<<"*************q.z:"<<q.z;
qDebug()<<"*************q.w:"<<q.w;
*/
// UGVector3d vPos;
// UGQuaternion4d q;
// UGCameraWorld::PosAndOrientation2CameraState(vPos,q,cs);
// qDebug()<<"*************vPos.x:"<<vPos.x;
// qDebug()<<"*************vPos.y:"<<vPos.y;
// qDebug()<<"*************vPos.z:"<<vPos.z;
// qDebug()<<"*************q.x:"<<q.x;
// qDebug()<<"*************q.y:"<<q.y;
// qDebug()<<"*************q.z:"<<q.z;
// qDebug()<<"*************q.w:"<<q.w;
// if(pSceneControl->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<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);
});
*/
UGLayer3D* layer3D = pSceneControl->GetSceneEditWnd()->GetScene3D()->m_Layers.AddLayer(_U("大陆机场18@Route"));
// pSceneControl->ViewToLayer(layer3D);
loadModelData();
/*地形碰撞检测
testFlag = !testFlag;
qDebug()<<"*******************:"<<testFlag;
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();
@ -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);

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

@ -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();

@ -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();

Loading…
Cancel
Save