2017-11-15 7 views
0

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); 
} 

答えて

1

、それだけにアップロードされたテクスチャについての情報を保持していますOpenGL。

生のOpenGLを使用してテクスチャデータを戻すことができます。おそらくQtを使ってそれを行う方法もありますが、私はそれをお勧めしません。 GPUとCPUの間でデータをコピーするのは遅いので、必要ない場合は避ける方がよい。

テクスチャをQImageのままにしておき、pixel(..)またはpixelColor(..)のメソッドを使用して簡単にピクセルの色を照会することをお勧めします。 2回ロードするのは無駄に思えるかもしれませんが、CPUからピクセルデータにアクセスする必要がある場合は、より良い方法はありません。

+0

「QTextureImage」が画像データそのものを保持していない場合、それは意味があります。テクスチャの座標は、 'QImage'のピクセル位置に直接マップされますか? –

+1

いいえ、テクスチャ座標の範囲は、左下隅から0.0〜1.0です。 'QImage'は、左上隅から始まる0から幅/高さまでの規則的なピクセル座標を使います。だから、幅と高さを掛けて、Y軸を反転して丸める必要があります。 – michalsrb

+1

テクスチャ座標が[0.0、1.0]の範囲外になる可能性もあります。その場合、OpenGLはそれらをラップまたはクランプします(デフォルトではラップ)。メッシュデータにそのような座標が含まれている場合は、ラップ/クランプする必要があります。 – michalsrb

関連する問題