QML 3D曲面图(Surface3D)技术
3D曲面图是科学计算和工程可视化中常用的图表类型,它通过起伏的曲面展示二维数据的变化趋势。Qt Data Visualization 模块中的 Surface3D 类型提供了强大的曲面可视化能力。
Surface3D 核心属性与方法
表:Surface3D主要属性与方法
属性/方法 | 类型 | 描述 | 示例 |
---|---|---|---|
width | real | 曲面图宽度 | width: parent.width |
height | real | 曲面图高度 | height: parent.height |
selectionMode | enum | 选择模式(无/单项/行/列/行与列/切片) | AbstractGraph3D.SelectionItem |
shadowQuality | enum | 阴影质量(无/低/中/高/软低/软中/软高) | AbstractGraph3D.ShadowQualityHigh |
scene.activeCamera | Q3DCamera | 控制场景相机 | scene.activeCamera.xRotation: 60.0 |
theme | Theme3D | 设置图表主题 | theme: Theme3D { type: Theme3D.ThemeArmyBlue } |
axisX | Value3DAxis | X轴配置 | axisX: Value3DAxis { title: "经度"; min: -180; max: 180 } |
axisY | Value3DAxis | Y轴配置 | axisY: Value3DAxis { title: "高度"; min: 0; max: 10000 } |
axisZ | Value3DAxis | Z轴配置 | axisZ: Value3DAxis { title: "纬度"; min: -90; max: 90 } |
flipHorizontalGrid | bool | 是否翻转水平网格 | flipHorizontalGrid: true |
surfaceSeries | list | 曲面系列列表 | surfaceSeries: [heightMapSeries, temperatureSeries] |
addSeries() | method | 添加曲面系列 | surface3D.addSeries(newSeries) |
removeSeries() | method | 移除曲面系列 | surface3D.removeSeries(oldSeries) |
release() | method | 释放资源 | Component.onDestruction: surface3D.release() |
基本曲面图实现
以下是一个完整的地形高度图示例,展示了如何使用Surface3D显示地理高程数据:
import QtQuick
import QtQuick.Controls
import QtDataVisualizationWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Surface3D {id: surfaceGraphanchors.fill: parenttheme: Theme3D { type: Theme3D.ThemeArmyBlue }// 设置坐标轴axisX: ValueAxis3D {title: "东西方向 (km)"}axisY: ValueAxis3D {title: "高度 (m)"min: 30max: 200}axisZ: ValueAxis3D {title: "南北方向 (km)"}// 添加曲面系列Surface3DSeries {id: terrainSeriesitemLabelFormat: "(@xLabel km, @zLabel km): @yLabel m"drawMode: Surface3DSeries.DrawSurfaceAndWireframeflatShadingEnabled: false// 使用高度图数据代理HeightMapSurfaceDataProxy {id: heightMapProxyheightMapFile: ":/layer_1.png"}// 自定义渐变颜色baseGradient: ColorGradient {ColorGradientStop { position: 0.0; color: "#0000ff" } // 深水区ColorGradientStop { position: 0.2; color: "#00ffff" } // 浅水区ColorGradientStop { position: 0.25; color: "#00aa00" } // 海滩ColorGradientStop { position: 0.5; color: "#ffff00" } // 平原ColorGradientStop { position: 0.75; color: "#aa5500" } // 山地ColorGradientStop { position: 1.0; color: "#ffffff" } // 雪山}// 网格线样式wireframeColor: "#555555"}// 相机初始位置scene.activeCamera.xRotation: 20.0scene.activeCamera.yRotation: 45.0}// 控制面板Row {anchors.top: parent.topanchors.right: parent.rightspacing: 10padding: 10Button {text: "俯视图"onClicked: {surfaceGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetFrontHigh}}Button {text: "侧视图"onClicked: {surfaceGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetRightLow}}Button {text: "等轴测"onClicked: {surfaceGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricRight}}ComboBox {id: drawModeCombomodel: ["Surface", "Wireframe", "Both"]onCurrentIndexChanged: {switch(currentIndex) {case 0: terrainSeries.drawMode = Surface3DSeries.DrawSurface; break;case 1: terrainSeries.drawMode = Surface3DSeries.DrawWireframe; break;case 2: terrainSeries.drawMode = Surface3DSeries.DrawSurfaceAndWireframe; break;}}}}
}