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