Volumetrisches Rendering
Rendering volumetrischer Objekte.
„Volumetrisches Rendering“ zeigt, wie man mit „ QCustom3DVolume “ volumetrische Daten darstellt.

Ausführen des Beispiels
Sie können das Beispiel wie folgt ausführen:
- Qt Creator
Öffnen Sie den Modus „ Welcome “ und wählen Sie das Beispiel unter „ Examples “ aus. Weitere Informationen finden Sie unter Qt Creator: Tutorial: Erstellen und Ausführen.
- Qt Extension for Visual Studio Code
Führen Sie den Befehl „ Qt: Open Qt examples “ über „ Command Palette “ aus und wählen Sie das Beispiel aus der Liste aus. Weitere Informationen finden Sie unter Qt Extension for Visual Studio Code: Tutorial: Erstellen und Ausführen.
Volumenelement initialisieren
Die „ QCustom3DVolume “-Elemente sind spezielle benutzerdefinierte Elemente (siehe QCustom3DItem), die zur Darstellung volumetrischer Daten verwendet werden können. Die Volumenelemente werden nur bei orthogonaler Projektion unterstützt. Stellen Sie daher zunächst sicher, dass das Diagramm diese verwendet:
m_graph->setOrthoProjection(true);Erstellen Sie ein Volumenelement, das an die Datenbereiche der Achsen gebunden ist:
m_volumeItem = new QCustom3DVolume;
// Adjust water level to zero with a minor tweak to y-coordinate position and scaling
m_volumeItem->setScaling(
QVector3D(m_graph->axisX()->max() - m_graph->axisX()->min(),
(m_graph->axisY()->max() - m_graph->axisY()->min()) * 0.91f,
m_graph->axisZ()->max() - m_graph->axisZ()->min()));
m_volumeItem->setPosition(
QVector3D((m_graph->axisX()->max() + m_graph->axisX()->min()) / 2.0f,
-0.045f * (m_graph->axisY()->max() - m_graph->axisY()->min()) +
(m_graph->axisY()->max() + m_graph->axisY()->min()) / 2.0f,
(m_graph->axisZ()->max() + m_graph->axisZ()->min()) / 2.0f));
m_volumeItem->setScalingAbsolute(false);Legen Sie fest, dass die Skalierung des Volumens den Änderungen der Datenbereiche folgen soll, indem Sie die Eigenschaft „ QCustom3DItem::scalingAbsolute “ auf „ false “ setzen. Definieren Sie anschließend den inneren Inhalt des Volumens:
m_volumeItem->setTextureWidth(lowDetailSize);
m_volumeItem->setTextureHeight(lowDetailSize / 2);
m_volumeItem->setTextureDepth(lowDetailSize);
m_volumeItem->setTextureFormat(QImage::Format_Indexed8);
m_volumeItem->setTextureData(new QList<uchar>(*m_lowDetailData));Verwenden Sie für die Textur 8-Bit-Indexfarben, da diese kompakt sind und eine einfache Anpassung der Farben ermöglichen, ohne dass die gesamte Textur neu generiert werden muss. Verwenden Sie für die Texturdaten die zuvor auf der Grundlage von Höhenkarten erstellten Daten. In der Regel liegen die Daten für Volumenelemente bereits in Form eines Bildstapels vor, sodass die Details zur Datengenerierung übersprungen werden können. Weitere Informationen zum eigentlichen Datengenerierungsprozess finden Sie im Beispielcode.
Da 8-Bit-Indexfarben verwendet werden, ist eine Farbtabelle erforderlich, um die 8-Bit-Farbindizes den tatsächlichen Farben zuzuordnen. In einem typischen Anwendungsfall würden Sie die Farbtabelle aus den Quellbildern beziehen, anstatt eine manuell definierte zu verwenden:
m_volumeItem->setColorTable(m_colorTable1);Um die Option zu haben, Schnittbilder um das Volumen herum anzuzeigen, initialisieren Sie deren Eigenschaften. Zunächst sind die Rahmen ausgeblendet:
m_volumeItem->setSliceFrameGaps(QVector3D(0.01f, 0.02f, 0.01f));
m_volumeItem->setSliceFrameThicknesses(QVector3D(0.0025f, 0.005f, 0.0025f));
m_volumeItem->setSliceFrameWidths(QVector3D(0.0025f, 0.005f, 0.0025f));
m_volumeItem->setDrawSliceFrames(false);Fügen Sie das Volumen abschließend als benutzerdefiniertes Element zum Diagramm hinzu, um es anzuzeigen:
m_graph->addCustomItem(m_volumeItem);Aufschneiden des Volumens
Sofern das Volumen nicht weitgehend transparent ist, können Sie nur dessen Oberfläche sehen, was oft nicht sehr hilfreich ist. Eine Möglichkeit, die innere Struktur des Volumens zu untersuchen, besteht darin, die Schnitte des Volumens anzuzeigen. „ QCustom3DVolume “ bietet zwei Möglichkeiten zur Darstellung der Schnitte. Die erste besteht darin, die ausgewählten Schnitte anstelle des Volumens anzuzeigen. Um beispielsweise einen Schnitt senkrecht zur X-Achse festzulegen, verwenden Sie die folgende Methode:
m_volumeItem->setSliceIndexX(m_sliceIndexX);Um den oben angegebenen Schnitt anzuzeigen, muss zusätzlich die Eigenschaft ` QCustom3DVolume::drawSlices ` gesetzt werden:
m_volumeItem->setDrawSlices(true);Die zweite Möglichkeit zur Anzeige von Schnitten ist die Verwendung der Methode ` QCustom3DVolume::renderSlice()`, die aus dem angegebenen Schnitt ein ` QImage ` erzeugt. Dieses Bild kann dann in einem anderen Widget, beispielsweise einem ` QLabel`, angezeigt werden:
Anpassen der Volumentransparenz
Manchmal reicht die Betrachtung der Schnitten allein nicht aus, um die innere Struktur des Volumens gut zu verstehen. „ QCustom3DVolume “ bietet zwei Eigenschaften, mit denen sich die Transparenz des Volumens anpassen lässt:
m_volumeItem->setAlphaMultiplier(mult);
...
m_volumeItem->setPreserveOpacity(enabled);Die Eigenschaft „ QCustom3DVolume::alphaMultiplier “ ist ein allgemeiner Multiplikator, der auf den Alpha-Wert jedes Voxels des Volumens angewendet wird. Damit lassen sich die bereits etwas transparenten Bereiche des Volumens einheitlich weiter durchscheinend machen, um undurchsichtige Details im Inneren sichtbar zu machen. Dieser Multiplikator hat keine Auswirkung auf vollständig undurchsichtige Farben, es sei denn, die Eigenschaft „ QCustom3DVolume::preserveOpacity “ ist auf „ false “ gesetzt.
Eine alternative Möglichkeit, die Transparenz des Volumens anzupassen, besteht darin, die Alpha-Werte der Voxel direkt zu ändern. Bei 8-Bit-Indextexturen geschieht dies einfach durch Ändern und Zurücksetzen der Farbtabelle:
int newAlpha = enabled ? terrainTransparency : 255;
for (int i = aboveWaterGroundColorsMin; i < underWaterGroundColorsMax; i++) {
QRgb oldColor1 = m_colorTable1.at(i);
QRgb oldColor2 = m_colorTable2.at(i);
m_colorTable1[i] = qRgba(qRed(oldColor1), qGreen(oldColor1), qBlue(oldColor1), newAlpha);
m_colorTable2[i] = qRgba(qRed(oldColor2), qGreen(oldColor2), qBlue(oldColor2), newAlpha);
}
if (m_usingPrimaryTable)
m_volumeItem->setColorTable(m_colorTable1);
else
m_volumeItem->setColorTable(m_colorTable2);High-Definition- vs. Low-Definition-Shader
Standardmäßig verwendet das volumetrische Rendering einen High-Definition-Shader. Dieser berücksichtigt bei der Strahlverfolgung des Volumeninhalts jeden Voxel des Volumens mit der richtigen Gewichtung und sorgt so für eine genaue Darstellung selbst feinster Details des Volumens. Dies ist jedoch rechenintensiv, wodurch die Bildrate leidet. Wenn die Rendering-Geschwindigkeit wichtiger ist als die pixelgenaue Darstellung des Volumeninhalts, sollten Sie den wesentlich schnelleren Shader mit niedriger Auflösung verwenden, indem Sie die Eigenschaft „ QCustom3DVolume::useHighDefShader “ auf „ false “ setzen. Der Shader mit niedriger Auflösung erreicht diese Geschwindigkeit durch Kompromisse bei der Genauigkeit, sodass nicht garantiert ist, dass jedes Voxel des Volumens abgetastet wird. Dies kann zu Flackern oder anderen Rendering-Artefakten bei den feineren Details des Volumens führen.
m_volumeItem->setUseHighDefShader(enabled);Beispielinhalt
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.