Qt3D: Как покрасить линии? - PullRequest
       24

Qt3D: Как покрасить линии?

1 голос
/ 21 февраля 2020

В сцене у меня есть линия и цилиндр. Для каждого объекта я использую компонент QDiffuseSpecularMaterial. Для каждого материала я установил only свойство diffuse, чтобы оно было желтого цвета (без установки каких-либо значений для параметров ambient, normal и specular). Результат следующий:

Цилиндр желтый, но линия черная

Если я изменю материал, использованный для линии, и установлю окружающий цвет будет желтым, линия будет желтой.

И цилиндр, и линия желтого цвета

Тем не менее, в этом случае, если я установлю Линейное затухание для светового объекта, я получу следующий результат:

На цилиндр влияет затухание света, но линия не является

Почему материал работает по-разному для этих двух объектов и как я могу это исправить?

Код, использованный для создания строки:

auto *geometry = new Qt3DRender::QGeometry(_rootEntity);

QByteArray bufferBytes;
bufferBytes.resize(3 * 2 * sizeof(float)); 
float *positions = reinterpret_cast<float*>(bufferBytes.data());
*positions++ = start.x();
*positions++ = start.y();
*positions++ = start.z();
*positions++ = end.x();
*positions++ = end.y();
*positions++ = end.z();

auto *buf = new Qt3DRender::QBuffer(geometry);
buf->setData(bufferBytes);

auto *positionAttribute = new Qt3DRender::QAttribute(geometry);
positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName());
positionAttribute->setVertexBaseType(Qt3DRender::QAttribute::Float);
positionAttribute->setVertexSize(3);
positionAttribute->setAttributeType(Qt3DRender::QAttribute::VertexAttribute);
positionAttribute->setBuffer(buf);
positionAttribute->setByteStride(3 * sizeof(float));
positionAttribute->setCount(2);
geometry->addAttribute(positionAttribute); 


QByteArray indexBytes;
indexBytes.resize(2 * sizeof(unsigned int)); // start to end
unsigned int *indices = reinterpret_cast<unsigned int*>(indexBytes.data());
*indices++ = 0;
*indices++ = 1;

auto *indexBuffer = new Qt3DRender::QBuffer(geometry);
indexBuffer->setData(indexBytes);

auto *indexAttribute = new Qt3DRender::QAttribute(geometry);
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
indexAttribute->setBuffer(indexBuffer);
indexAttribute->setCount(2);
geometry->addAttribute(indexAttribute); 

// mesh
auto *line = new Qt3DRender::QGeometryRenderer(_rootEntity);
line->setGeometry(geometry);
line->setPrimitiveType(Qt3DRender::QGeometryRenderer::Lines);
auto *material = new Qt3DExtras::QDiffuseSpecularMaterial(_rootEntity);
material->setDiffuse(color);

//material->setAmbient(color);

// entity
auto *lineEntity = new Qt3DCore::QEntity(_rootEntity);
lineEntity->addComponent(line);
lineEntity->addComponent(material);

Код, использованный для создания цилиндра:

// Cylinder shape data
Qt3DExtras::QCylinderMesh *cylinder = new Qt3DExtras::QCylinderMesh();
cylinder->setRadius(1);
cylinder->setLength(3);
cylinder->setRings(100);
cylinder->setSlices(20);

// CylinderMesh Transform
Qt3DCore::QTransform *cylinderTransform = new Qt3DCore::QTransform();
cylinderTransform->setScale(1.5f);
cylinderTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1.0f, 0.0f, 0.0f), 45.0f));
cylinderTransform->setTranslation(QVector3D(-5.0f, 4.0f, -1.5));

Qt3DExtras::QDiffuseSpecularMaterial *cylinderMaterial = new Qt3DExtras::QDiffuseSpecularMaterial();
cylinderMaterial->setDiffuse(QColor("yellow"));

// Cylinder
auto m_cylinderEntity = new Qt3DCore::QEntity(rootEntity);
m_cylinderEntity->addComponent(cylinder);
m_cylinderEntity->addComponent(cylinderMaterial);
m_cylinderEntity->addComponent(cylinderTransform);
...