2017-11-15 3 views
0

Ich entwickle eine Anwendung mit Qt3Ds Scene3D-Komponenten. Ich habe ein Mesh-Obj in die Scene3D geladen und ein PNG-Bild als diffuse Karte über QDiffuseMapMaterial angewendet. Großartig bisher, Objekt rendert mit Karte korrekt.Get diffuse Karte RGB-Daten von Qt3D PickEvent

Jetzt muss ich die RGB-Eigenschaften für einen ausgewählten Eckpunkt mit einem QPickEvent erhalten. Ich aquire ein paar Vertex Eigenschaften wie folgt:

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

Ich habe dann den Vertex-Index, die Position und UV-Texturkoordinaten. Nun, was ich brauche, sind die RGB-Daten von der UV-Position für den gegebenen Eckpunkt. Wie gehe ich vor, um diese Daten zu bekommen? Ich behalte das diffuse Material und die QTextureImage mit der diffusen Karte im Speicher. Ich bin sicher, es gibt eine Möglichkeit, den RGB-Wert zu erhalten, ich brauche nur ein wenig Hilfe bei der Übersetzung der UV-Textur-Koordinate in QTextureImage und erhalte die Pixeldaten.

Followup

die Antwort gegeben verwenden, bin ich das Bild in einem QImage Objekt hält, erhalte ich die Vertexposition, gefolgt von Texturkoordinaten. Unter Verwendung der Texturkoordinaten, ich bin in der Lage, die Pixelposition zu erhalten und die Farbe des Pixels diese kleine Funktion:

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

Antwort

1

Die QTextureImage halten nicht die Bilddaten selbst, es hält nur Informationen über die Textur, die hochgeladen wurde OpenGL.

Es ist möglich, die Texturdaten mit roher OpenGL zurück zu erhalten. Es gibt wahrscheinlich einen Weg, es auch mit Qt zu tun, aber ich würde es nicht empfehlen. Kopieren von Daten zwischen GPU und CPU ist langsam, also besser, es zu vermeiden, wenn nicht notwendig.

Ich würde empfehlen, die Textur in einem QImage geladen zu halten, dann können Sie leicht zu Pixelfarben mit pixel(..) oder pixelColor(..) Methoden abfragen. Es mag verschwenderisch erscheinen, wenn es zweimal geladen wird, aber wenn Sie auf die Pixeldaten von der CPU zugreifen müssen, gibt es keinen besseren Weg.

+0

Ok, das macht Sinn, wenn 'QTextureImage' die Bilddaten nicht selbst enthält. Weißt du, würden die Texturkoordinaten direkt auf die Pixelposition im 'QImage' abgebildet? –

+1

Nein, Texturkoordinaten reichen von 0.0 bis 1.0 beginnend in der unteren linken Ecke. 'QImage' verwendet normale Pixelkoordinaten von 0 bis Breite/Höhe beginnend in der oberen linken Ecke. Du musst also mit Breite und Höhe multiplizieren, Y-Achse umdrehen und runden. – michalsrb

+1

Es ist auch möglich, dass Texturkoordinaten außerhalb des Bereichs [0.0, 1.0] liegen. In diesem Fall wird sie von OpenGL umbrochen oder geklammert (standardmäßig umbrochen). Wenn Ihre Mesh-Daten solche Koordinaten enthalten, müssen Sie sie ebenfalls umbrechen/klammern. – michalsrb