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

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.
Initialisierung von Volumenelementen
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);Geben Sie an, 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 internen 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));Verwende 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. Verwende 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 festgelegten Schnitt anzuzeigen, muss außerdem 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 Bild ` 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 stellt zwei Eigenschaften zur Verfügung, mit denen die Transparenz des Volumens angepasst werden kann:
m_volumeItem->setAlphaMultiplier(mult);
...
m_volumeItem->setPreserveOpacity(enabled);Der „ QCustom3DVolume::alphaMultiplier “ ist ein allgemeiner Multiplikator, der auf den Alpha-Wert jedes Voxels des Volumens angewendet wird. Er ermöglicht es, den bereits etwas transparenten Bereichen des Volumens eine einheitliche Transparenz hinzuzufügen, um undurchsichtige Details im Inneren sichtbar zu machen. Dieser Multiplikator hat keinen Einfluss auf Farben, die vollständig undurchsichtig sind, 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 verä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 Raytracing-Berechnung des Volumeninhalts jeden Voxel des Volumens mit der richtigen Gewichtung und liefert so eine genaue Darstellung selbst der feinsten Details des Volumens. Dies ist jedoch rechenintensiv, sodass die Bildrate darunter leidet. Wenn die Rendering-Geschwindigkeit wichtiger ist als die pixelgenaue Wiedergabe 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 seine 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.