4import QGroundControl.Controls
9 readonly property real _viewDistance: 50000
10 readonly property var _gpsRef: QGCViewer3DManager.gpsRef
12 property real movementSpeed: 1
13 property real rotationSpeed: 0.1
14 property real zoomSpeed: 0.3
16 function moveCamera(newPose: vector2d, lastPose: vector2d) {
17 let _roll = standAloneScene.cameraOneRotation.x * (Math.PI / 180);
18 let _pitch = standAloneScene.cameraOneRotation.y * (Math.PI / 180);
20 let dx_l = (newPose.x - lastPose.x) * movementSpeed * movementSpeedAdjustment(2000.0, 4);
21 let dy_l = (newPose.y - lastPose.y) * movementSpeed * movementSpeedAdjustment(2000.0, 4);
23 //Note: Rotation Matrix is computed as: R = R(-_pitch) * R(_roll)
24 // Then the corerxt tramslation is: d = R * [dx_l; dy_l; dz_l]
26 let dx = dx_l * Math.cos(_pitch) - dy_l * Math.sin(_pitch) * Math.sin(_roll);
27 let dy = dy_l * Math.cos(_roll);
28 let dz = dx_l * Math.sin(_pitch) + dy_l * Math.cos(_pitch) * Math.sin(_roll);
30 standAloneScene.cameraTwoPosition.x -= dx;
31 standAloneScene.cameraTwoPosition.y += dy;
32 standAloneScene.cameraTwoPosition.z += dz;
35 function movementSpeedAdjustment(adjustmentScale, maxValue) {
36 let _adjustmentValue = standAloneScene.cameraTwoPosition.length() / adjustmentScale;
37 return Math.min(Math.max(1, _adjustmentValue), maxValue);
40 function rotateCamera(newPose: vector2d, lastPose: vector2d) {
41 let rotation_vec = Qt.vector2d(newPose.y - lastPose.y, newPose.x - lastPose.x);
43 let dx_l = rotation_vec.x * rotationSpeed;
44 let dy_l = rotation_vec.y * rotationSpeed;
46 standAloneScene.cameraOneRotation.x += dx_l;
47 standAloneScene.cameraOneRotation.y += dy_l;
50 function zoomCamera(zoomValue) {
51 let dz_l = zoomValue * zoomSpeed * movementSpeedAdjustment(2000.0, 4);
53 let _roll = standAloneScene.cameraOneRotation.x * (Math.PI / 180);
54 let _pitch = standAloneScene.cameraOneRotation.y * (Math.PI / 180);
56 let dx = -dz_l * Math.cos(_roll) * Math.sin(_pitch);
57 let dy = -dz_l * Math.sin(_roll);
58 let dz = dz_l * Math.cos(_pitch) * Math.cos(_roll);
60 standAloneScene.cameraTwoPosition.x -= dx;
61 standAloneScene.cameraTwoPosition.y += dy;
62 standAloneScene.cameraTwoPosition.z += dz;
65 camera: standAloneScene.cameraOne
67 environment: SceneEnvironment {
68 antialiasingMode: SceneEnvironment.MSAA
69 antialiasingQuality: SceneEnvironment.High
70 backgroundMode: SceneEnvironment.Color
77 depthFar: _viewDistance
83 QGCPalette { id: qgcPal }
85 readonly property color _skyColor: qgcPal.window
86 importScene: CameraLightModel {
89 viewDistance: _viewDistance
92 Component.onCompleted: {
93 vehicle3DLoader.active = true;
94 mapGeometryLoader.active = true;
97 standAloneScene.resetCamera();
100 Viewer3DProgressBar {
101 id: _terrainProgressBar
103 progressText: qsTr("Downloading Imageries: ")
104 width: ScreenTools.screenWidth * 0.2
107 bottom: parent.bottom
108 horizontalCenter: parent.horizontalCenter
109 margins: ScreenTools.defaultFontPixelWidth
114 property: "progressValue"
115 target: _terrainProgressBar
116 value: (mapGeometryLoader.active) ? (mapGeometryLoader.item.textureDownloadProgress) : (100)
117 when: mapGeometryLoader.status == Loader.Ready
121 id: buildingsGeometryComponent
124 property real textureDownloadProgress: _terrainTextureManager.textureDownloadProgress
129 scale: Qt.vector3d(10, 10, 10)
132 geometry: CityMapGeometry {
135 mapProvider: QGCViewer3DManager.mapProvider
136 modelName: "city_map"
141 indexOfRefraction: 4.0
153 scale: Qt.vector3d(10, 10, 10)
156 geometry: Viewer3DTerrainGeometry {
157 id: terrainGeometryManager
159 refCoordinate: _gpsRef
161 materials: CustomMaterial {
162 property TextureInput someTextureMap: TextureInput {
164 textureData: _terrainTextureManager
168 fragmentShader: "/qml/QGroundControl/Viewer3D/ShaderFragment/earthMaterial.frag"
169 vertexShader: "/qml/QGroundControl/Viewer3D/ShaderVertex/earthMaterial.vert"
173 Viewer3DTerrainTexture {
174 id: _terrainTextureManager
176 mapProvider: QGCViewer3DManager.mapProvider
178 onTextureGeometryDoneChanged: {
179 if (textureGeometryDone === true) {
180 terrainGeometryManager.sectorCount = tileCount.width;
181 terrainGeometryManager.stackCount = tileCount.height;
182 terrainGeometryManager.roiMin = roiMinCoordinate;
183 terrainGeometryManager.roiMax = roiMaxCoordinate;
184 terrainGeometryManager.updateEarthData();
192 id: mapGeometryLoader
195 sourceComponent: buildingsGeometryComponent
199 id: vehicle3DComponent
202 model: QGroundControl.multiVehicleManager.vehicles
204 delegate: Viewer3DVehicleItems {
205 _backendQml: QGCViewer3DManager
206 _camera: standAloneScene.cameraOne
207 _planMasterController: masterController
210 PlanMasterController {
213 Component.onCompleted: startStaticActiveVehicle(object)
223 sourceComponent: vehicle3DComponent
227 id: cameraMovementDragHandler
229 property bool _isMoving: false
230 property point _lastPose
232 acceptedButtons: Qt.LeftButton
233 acceptedModifiers: Qt.NoModifier
237 if (active) { // When mouse is pressed
238 _lastPose = Qt.point(centroid.position.x, centroid.position.y);
240 } else { // When mouse is released
246 moveCamera(centroid.position, _lastPose);
247 _lastPose = Qt.point(centroid.position.x, centroid.position.y);
253 id: cameraRotationDragHandler
255 property bool _isRotating: false
256 property point _lastPose
258 acceptedButtons: Qt.RightButton
259 acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
260 acceptedModifiers: Qt.NoModifier
264 if (active) { // When mouse is pressed
265 _lastPose = Qt.point(centroid.position.x, centroid.position.y);
267 } else {// When mouse is released
273 rotateCamera(centroid.position, _lastPose);
274 _lastPose = Qt.point(centroid.position.x, centroid.position.y);
280 id: zoomRotationPinchHandler
282 property bool _isRotating: false
283 property point _lastPose
284 property real _lastZoomValue
290 _lastPose = Qt.point(centroid.position.x, centroid.position.y);
297 onActiveScaleChanged: {
298 let zoomValue = (activeScale > 1) ? (activeScale - 1) : (-((1 / activeScale) - 1));
299 zoomCamera(-1000 * (zoomValue - _lastZoomValue));
300 _lastZoomValue = zoomValue;
304 rotateCamera(centroid.position, _lastPose);
305 _lastPose = Qt.point(centroid.position.x, centroid.position.y);
313 acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
314 orientation: Qt.Vertical
318 zoomCamera(-event.angleDelta.y);
323 function deselectAllWaypoints() {
324 if (!vehicle3DLoader.item)
326 for (var i = 0; i < vehicle3DLoader.item.count; i++) {
327 vehicle3DLoader.item.objectAt(i).waypointInstancing.selectedIndex = -1;
331 onTapped: function (eventPoint) {
332 if (!vehicle3DLoader.item)
336 for (var i = 0; i < vehicle3DLoader.item.count; i++) {
337 models.push(vehicle3DLoader.item.objectAt(i).waypointConeModel);
340 var results = topView.pickSubset(eventPoint.position.x, eventPoint.position.y, models);
341 if (results.length === 0) {
342 deselectAllWaypoints();
346 var result = results[0];
347 for (var i = 0; i < vehicle3DLoader.item.count; i++) {
348 var vehicleItem = vehicle3DLoader.item.objectAt(i);
349 if (result.objectHit === vehicleItem.waypointConeModel) {
350 vehicleItem.waypointInstancing.selectedIndex = result.instanceIndex;
355 deselectAllWaypoints();