Qt3DのScene3Dコンポーネントを使用してアプリケーションを開発しています。私はScene3D
にメッシュobjをロードし、QDiffuseMapMaterial
を介して拡散マップとしてPNG画像を適用しました。これまでのところ、オブジェクトはマップで正しく描画されます。Qt3D PickEventからdiffuse map RGBデータを取得
ここでは、QPickEvent
を使用して、選択した頂点のRGBプロパティを取得する必要があります。私はそうのようないくつかの頂点プロパティをAQUIRE:
ESEctoPoint ES3DAnalysisEntity::getVertexDataFromIndex(quint32 idx)
{
ESEctoPoint vData;
vData.vIndex = idx;
const QGeometry *geometry = m_mesh->geometry();
for (QAttribute* attribute : geometry->attributes())
{
if (attribute->name() == defaultTextureCoordinateAttributeName())
{
vData.vTexCoord = extractVertexData<QVector2D, uint>(attribute, idx);
}
...
}
return vData;
}
私はその後、頂点インデックス、位置、およびUVテクスチャ座標を持っています。さて、私が必要とするのは、与えられた頂点のuv位置からのRGBデータです。そのデータを取得するにはどうしたらいいですか?私は拡散物質と拡散マップを含むメモリをQTextureImage
に保存しています。私は、RGB値を取得する方法があると確信しています。ちょうど、uvテクスチャ座標をQTextureImageに変換し、ピクセルデータを取得する方法について少し助けが必要です。与えられた答えを使用して
フォロー
、私はQImage
オブジェクト内の画像を保持していますが、私は、テクスチャ座標に続いて頂点位置を取得します。テクスチャ座標を使用して、私はこの小さな機能を使用してピクセル位置とピクセルの色を取得することができています:QTextureImage
は、画像データそのものを保持していない
QColor getPixelColorForTexturePos(QVector2D const& uvPos, QImage* map)
{
auto x = uvPos.x() * map->width();
auto y = map->height() - (uvPos.y() * map->height());
return map->pixelColor((int)x, (int)y);
}
「QTextureImage」が画像データそのものを保持していない場合、それは意味があります。テクスチャの座標は、 'QImage'のピクセル位置に直接マップされますか? –
いいえ、テクスチャ座標の範囲は、左下隅から0.0〜1.0です。 'QImage'は、左上隅から始まる0から幅/高さまでの規則的なピクセル座標を使います。だから、幅と高さを掛けて、Y軸を反転して丸める必要があります。 – michalsrb
テクスチャ座標が[0.0、1.0]の範囲外になる可能性もあります。その場合、OpenGLはそれらをラップまたはクランプします(デフォルトではラップ)。メッシュデータにそのような座標が含まれている場合は、ラップ/クランプする必要があります。 – michalsrb