gpt4 book ai didi

c++ - Qt3D 从 QGeometry 读取原始顶点数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:12 24 4
gpt4 key购买 nike

我正在使用 Qt3D 开发应用程序,需要通过 C++ 访问原始顶点数据。我正在使用 QObjectPicker 进行光线指向,但由于数据是专门的(我开发了一个导入器,它向包含温度读数的每个顶点添加了一个额外的属性)我不能使用 QObjectPicker 方便地从点读取数据。

3D 对象正在通过 QMesh 加载,所以我相信访问原始数据的最佳方式是通过 QMeshQGeometry 成员.如果我错了纠正我。 QGeometry 有一个包含顶点属性的 QAttribute vector 。 (同样,如果我错了,请纠正我。)从这一点来看,我不确定如何从特定的顶点索引读取数据。我的猜测是我需要通过了解每个顶点数据的大小并从其偏移量读取数据来在特定位置从 QAttribute::buffer 读取数据,但我将如何在此处执行此操作?

这是我到目前为止想出的:

void ES3DScene::handlePickerClicked(QPickEvent *pick)
{
QPickTriangleEvent *trianglePick = qobject_cast<QPickTriangleEvent*>(pick);
// I'd like to get the vertex data from vertex1Index's position.
qDebug() << "Clicked " << trianglePick->vertex1Index();
QGeometry *geometry = m_mesh->geometry();
auto attributes = geometry->attributes();
for (auto i = 0; i < attributes.count(); ++i)
{
if (attributes.at(i)->name() == QAttribute::defaultPositionAttributeName())
{
QAttribute *attribute = attributes.at(i);
qDebug() << "Attrib " << attribute;

//This is where I'm stuck. I need to read the vertex attributes for the
//vertex at trianglePick->vertex1Index();

break;
}
}
}

最佳答案

我认为您必须访问您感兴趣的属性的 QBuffer。这可能不是具有 defaultPositionAttributeName() 的属性,而是您提供的名称它在你的进口商。获取实际数据需要您将其从 QByteArray 转换为正确的数据类型,并使用 QAttributebyteStride 中包含的信息获取数据中的正确位置和 byteOffset。您可能还想使用 vertexSizevertexBaseType,具体取决于您编写导入程序的方式。

按照这些思路应该可以工作(未测试):

void ES3DScene::handlePickerClicked(QPickEvent *pick)
{
QPickTriangleEvent *trianglePick = qobject_cast<QPickTriangleEvent*>(pick);
QGeometry *geometry = m_mesh->geometry();
auto attributes = geometry->attributes();
int vertexIndex = trianglePick->vertex1Index();
for (auto i = 0; i < attributes.count(); ++i)
{
if (attributes.at(i)->name() == "yourattributename")
{
QAttribute *attribute = attributes.at(i);
QBuffer *buffer = attribute->buffer();
const QByteArray &data = buffer->data();

int vertexOffset = vertexIndex * attribute->byteStride();
int offset = vertexOffset + attribute.byteOffset();

const char *rawData = &(data.constData()[offset]);

// replace float with your data type
float *value = reinterpret_cast<float*>(rawData);

break;
}
}
}

关于c++ - Qt3D 从 QGeometry 读取原始顶点数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46667975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com