ボリューメトリック・レンダリング
ボリューメトリック オブジェクトのレンダリング
ボリューメトリック・レンダリングでは、QCustom3DVolume を使用してボリューメトリック・データを表示する方法を示します。
例を実行する
から例を実行するには、 モードを開き、 から例を選択します。 Qt Creatorからサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、Building and Running an Exampleを参照してください。
体積アイテムの初期化
QCustom3DVolume アイテムは特別なカスタムアイテムで(QCustom3DItem を参照)、ボリュームデータを表示するために使用できます。ボリューム・アイテムは正射投影でのみサポートされているので、まずグラフがそれを使用していることを確認する:
m_graph->setOrthoProjection(true);
軸のデータ範囲に関連付けられた体積アイテムを作成する:
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);
QCustom3DItem::scalingAbsolute プロパティをfalse
に設定することで、ボリュームのスケーリングがデータ範囲の変化に従うべきことを示します。 次に、ボリュームの内部コンテンツを定義します:
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));
テクスチャには8ビットのインデックス付きカラーを使用します。コンパクトで、テクスチャ全体をリセットする必要がなく、色の調整が簡単になるからです。テクスチャデータには、先にハイトマップに基づいて作成したデータを使用します。通常、ボリュームアイテムのデータは、画像のスタックの形であらかじめ生成されているので、データ生成の詳細は省略できます。実際のデータ生成処理の詳細については、サンプルコードを参照してください。
8ビットインデックスカラーを使用するため、8ビットカラーインデックスを実際の色にマッピングするカラーテーブルが必要です。一般的な使用例では、カラーテーブルを手動で定義するのではなく、ソース画像から取得します:
m_volumeItem->setColorTable(m_colorTable1);
ボリュームの周囲にスライスフレームを表示するオプションを設定するには、そのプロパティを初期化します。初期状態では、フレームは非表示になっています:
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);
最後に、ボリュームをカスタムアイテムとしてグラフに追加して表示します:
m_graph->addCustomItem(m_volumeItem);
ボリュームへのスライス
ボリュームの大部分が透明でない限り、ボリュームの表面しか見ることができません。ボリュームの内部構造を検査する1つの方法は、ボリュームのスライスを表示することです。QCustom3DVolume 、スライスを表示する2つの方法があります。1つ目は、ボリュームの代わりに選択したスライスを表示する方法です。例えば、X軸に垂直なスライスを指定するには、以下の方法を使用します:
m_volumeItem->setSliceIndexX(m_sliceIndexX);
上記で指定したスライスを表示するには、QCustom3DVolume::drawSlices プロパティも設定する必要があります:
m_volumeItem->setDrawSlices(true);
スライスを表示する2つ目の方法は、QCustom3DVolume::renderSlice ()メソッドを使用することです。このメソッドは、指定されたスライスからQImage 。この画像は、QLabel などの別のウィジェットに表示できます:
ボリュームの透明度を調整する
スライスだけを表示しても、ボリュームの内部構造がよくわからないことがあります。QCustom3DVolume 、ボリュームの透明度を調整するために使用できる2つのプロパティが用意されています:
m_volumeItem->setAlphaMultiplier(mult); ... m_volumeItem->setPreserveOpacity(enabled);
QCustom3DVolume::alphaMultiplier は、ボリュームの各ボクセルのアルファ値に適用される一般的な乗数です。これにより、ボリュームのすでにある程度透明な部分に均一な透明度を追加して、内部の不透明な詳細を明らかにすることができます。この乗数は、QCustom3DVolume::preserveOpacity プロパティがfalse
に設定されていない限り、完全に不透明な色には影響しません。
ボリュームの透明度を調整する別の方法は、ボクセルのアルファ値を直接調整することです。8 ビットのインデックス付きテクスチャの場合、これは単純にカラーテーブルを修正してリセットすることで行えます:
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);
高解像度シェーダと低解像度シェーダ
デフォルトでは、ボリュームレンダリングは高解像度シェーダを使用します。これは、ボリュームの内容をレイトレースするときに、ボリュームの各ボクセルに適切なウェイトを割り当て、ボリュームの細かいディテールまで正確に表現します。しかし、これは計算コストが非常に高いため、フレームレートが低下します。ボリューム内容のピクセルパーフェクトな正確さよりもレンダリング速度の方が重要な場合は、QCustom3DVolume::useHighDefShader プロパティfalse
を設定して、はるかに高速な低解像度シェーダを使用してください。低精細度シェーダは、精度を妥協することで速度を達成しているので、ボ リュームのすべてのボクセルがサンプリングされることを保証しません。そのため、ボリュームのすべてのボクセルがサンプリングされる保証はありません。このため、ボリュームの細部でちらつきやその他のレンダリングアーチファクトが発生する可能性があります。
m_volumeItem->setUseHighDefShader(enabled);
コンテンツ例
© 2025 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.