Qt3D의 Scene3D 구성 요소를 사용하여 응용 프로그램을 개발 중입니다. 메쉬 obj를 Scene3D
에로드하고 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 데이터입니다. 해당 데이터를 가져 오려면 어떻게해야합니까? 난 diffuse 자료 및 확산지도가 메모리에 포함 된 QTextureImage
유지 해요. RGB 값을 얻을 수있는 방법이 있다고 확신합니다. uv 텍스처 좌표를 QTextureImage로 변환하고 픽셀 데이터를 얻는 방법에 대한 약간의 도움이 필요합니다. 주어진 답을 사용
후속
, 나는 QImage
객체의 이미지를 유지하고, 나는 텍스처 좌표 다음에 정점 위치를 얻을. 텍스처 좌표를 사용하여, 나는 픽셀 위치를 얻을 수 오전이 작은 기능을 사용하여 픽셀의 색상 : 이미지 데이터 자체를 보유하지 않습니다
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에서부터 width/height까지의 정규 픽셀 좌표를 사용합니다. 따라서 너비와 높이를 곱하고 Y 축을 반전하고 둥글게해야합니다. – michalsrb
텍스처 좌표가 [0.0, 1.0] 범위를 벗어나는 것도 가능합니다. 이 경우에는 OpenGL이 래핑하거나 클램핑합니다 (기본적으로 줄 바꿈). 따라서 메쉬 데이터에 이러한 좌표가 포함될 수 있으면이를 래핑하거나 클램핑해야합니다. – michalsrb