2017-11-15 37 views
0

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

답변

1

QTextureImage, 그냥 업로드 된 텍스처에 대한 정보를 보유하고 OpenGL.

원시 OpenGL을 사용하여 텍스처 데이터를 다시 가져올 수 있습니다. 아마도 Qt를 사용하여 그것을 할 수있는 방법이 있을지 모르지만 나는 그것을 권장하지 않습니다. GPU와 CPU간에 데이터를 복사하는 속도가 느리 므로 필요하지 않은 경우이를 피하는 것이 좋습니다.

질감을로드하는 것이 좋습니다 QImage 다음, 당신은 쉽게 pixel(..) 또는 pixelColor(..) 방법을 사용하여 픽셀 색상을 쿼리 할 수 ​​있습니다. 두 번로드하는 것은 낭비스러운 것처럼 보일 수 있지만 CPU에서 픽셀 데이터에 액세스해야하는 경우 더 좋은 방법은 없습니다.

+0

'QTextureImage'가 이미지 데이터 자체를 가지고 있지 않다면 괜찮습니다. 아시나요? 텍스처 좌표가'QImage'의 픽셀 위치에 직접 매핑됩니까? –

+1

아니요, 텍스처 좌표의 범위는 왼쪽 하단부터 0.0에서 1.0까지입니다. 'QImage'는 왼쪽 위 모퉁이에서 시작하여 0에서부터 width/height까지의 정규 픽셀 좌표를 사용합니다. 따라서 너비와 높이를 곱하고 Y 축을 반전하고 둥글게해야합니다. – michalsrb

+1

텍스처 좌표가 [0.0, 1.0] 범위를 벗어나는 것도 가능합니다. 이 경우에는 OpenGL이 래핑하거나 클램핑합니다 (기본적으로 줄 바꿈). 따라서 메쉬 데이터에 이러한 좌표가 포함될 수 있으면이를 래핑하거나 클램핑해야합니다. – michalsrb