问题描述
我正在尝试使用 Qt3D 渲染 3D 扫描仪捕获的帧。网格在几何体中构造正确,但显示为黑色。 下面是我转换顶点、纹理坐标、法线并将结果对象添加到场景的函数。出于调试目的,我试图将纹理从一个源 .png 文件映射到所有帧。但它看起来仍然是黑色的。归一化纹理坐标向量没有帮助。 请查看我的代码并说明我在做什么。提前致谢。
Qt3DCore::QEntity* object = new Qt3DCore::QEntity(parent);
Qt3DRender::QGeometryRenderer* renderer = new Qt3DRender::QGeometryRenderer(object);
Qt3DRender::QGeometry* geometry = new Qt3DRender::QGeometry(renderer);
Qt3DRender::QBuffer* vertexBuffer = new Qt3DRender::QBuffer(geometry);
Qt3DRender::QBuffer* indexBuffer = new Qt3DRender::QBuffer(geometry);
Qt3DRender::QAttribute* positionAttribute = new Qt3DRender::QAttribute(geometry);
Qt3DRender::QAttribute* normalAttribute = new Qt3DRender::QAttribute(geometry);
Qt3DRender::QAttribute* texCoordAttribute = new Qt3DRender::QAttribute(geometry);
Qt3DRender::QAttribute* indexAttribute = new Qt3DRender::QAttribute(geometry);
const quint32 stride = (3 + 3 + 2) * sizeof(float);
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setDataType(Qt3DRender::QAttribute::Float);
positionAttribute->setDataSize(3);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
positionAttribute->setBuffer(vertexBuffer);
positionAttribute->setByteOffset(0);
positionAttribute->setByteStride(stride);
normalAttribute->setName(Qt3DRender::QAttribute::defaultnormalAttributeName());
normalAttribute->setDataType(Qt3DRender::QAttribute::Float);
normalAttribute->setDataSize(3);
normalAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
normalAttribute->setBuffer(vertexBuffer);
normalAttribute->setByteOffset(3 * sizeof(float));
normalAttribute->setByteStride(stride);
texCoordAttribute->setName(Qt3DRender::QAttribute::defaultTextureCoordinateAttributeName());
texCoordAttribute->setDataType(Qt3DRender::QAttribute::Float);
texCoordAttribute->setDataSize(2);
texCoordAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
texCoordAttribute->setBuffer(vertexBuffer);
texCoordAttribute->setByteOffset((3 + 3) * sizeof(float));
texCoordAttribute->setByteStride(stride);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
indexAttribute->setDataType(Qt3DRender::QAttribute::Int);
indexAttribute->setDataSize(3);
indexAttribute->setByteOffset(0);
indexAttribute->setBuffer(indexBuffer);
indexAttribute->setCount(indices.size());
QByteArray* vertexArray = new QByteArray;
const auto t = vertices.size();
const auto r = sizeof(VertexData);
const auto d = t * r;
vertexArray->resize(vertices.size() * sizeof(VertexData));
float* rawVertexArray = reinterpret_cast<float*>(vertexArray->data());
int index = 0;
for (int i = 0; i < vertices.size(); ++i)
{
rawVertexArray[index++] = vertices[i].position_.x();
rawVertexArray[index++] = vertices[i].position_.y();
rawVertexArray[index++] = vertices[i].position_.z();
rawVertexArray[index++] = vertices[i].normal_.x();
rawVertexArray[index++] = vertices[i].normal_.y();
rawVertexArray[index++] = vertices[i].normal_.z();
const auto x = vertices[i].texCoords_.x();
rawVertexArray[index++] = vertices[i].texCoords_.x();
const auto y = vertices[i].texCoords_.y();
rawVertexArray[index++] = vertices[i].texCoords_.y();
}
QByteArray* indexArray = new QByteArray;
indexArray->resize(indices.size() * sizeof(VertexData));
auto* rawIndexArray = reinterpret_cast<int*>(indexArray->data());
index = 0;
for (int i = 0; i < indices.size(); ++i)
{
rawIndexArray[index++] = indices[i].x();
rawIndexArray[index++] = indices[i].y();
rawIndexArray[index++] = indices[i].z();
}
vertexBuffer->setData(*vertexArray);
indexBuffer->setData(*indexArray);
geometry->addAttribute(positionAttribute);
geometry->addAttribute(normalAttribute);
geometry->addAttribute(texCoordAttribute);
geometry->addAttribute(indexAttribute);
renderer->setGeometry(geometry);
renderer->setInstanceCount(1);
renderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::TriangleFan);
object->addComponent(renderer);
// Texture
Qt3DRender::QTexture2D* targetTexture = new Qt3DRender::QTexture2D(renderer);
Qt3DRender::QTextureImage* textureImage = new Qt3DRender::QTextureImage(targetTexture);
Qt3DExtras::QDiffusespecularMaterial* material = new Qt3DExtras::QDiffusespecularMaterial(renderer);
//Qt3DExtras::QnormalDiffusespecularMapMaterial* material = new Qt3DExtras::QnormalDiffusespecularMapMaterial();
textureImage->setMirrored(true);
textureImage->setSource(QUrl::fromLocalFile("D://Calibration tool//app-calibration-tool//output//1.jpg"));
targetTexture->addTextureImage(textureImage);
material->setDiffuse(QVariant::fromValue<Qt3DRender::QAbstractTexture *>(targetTexture));
material->setAmbient(QColor(255,255,1));
material->setspecular(QColor(255,1));
material->setTextureScale(4);
material->setAlphaBlendingEnabled(true);
const auto transform = new Qt3DCore::QTransform(renderer);
object->addComponent(transform);
object->addComponent(material);
return parent;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)