在我的公司中,已经从旧的3D引擎转换为Qt3d。这项工作的目标之一是将旧3D引擎的渲染视图与Qt3d渲染进行比较。
为此,我编写了一个小示例应用程序,可以在其中比较新旧渲染。仍然有很多差异。我的第一个想法是切换两个引擎中的所有光源,并比较两个渲染的轮廓。
现在,有些事情我真的不明白,这与Qt3d照明模型有关。
在我的小型示例应用程序中,我定义了一个简单的球体网格,一个摄像头和一个复选框,可以禁用点光源。该球体被phong reflection model照亮。
不,如果我关闭照明,我的查看器中会出现一个简单的黑色球体,因为实际上没有光。相反,仍然有一些照明(来自其他来源)。我认为,还有其他一些光源是默认启用的。
如何禁用Qt3d中的所有光源?作为附带问题,我还想知道为什么meshMaterial->setAmbient(QColor(255, 0, 0));
毕竟对材料没有可见的影响。您在这里输入什么都没关系。
#include <QApplication>
#include <QWidget>
#include <QCheckBox>
#include <QVBoxLayout>
#include <QFrame>
#include <Qt3DCore/QTransform.h>
#include <Qt3DRender/QCamera.h>
#include <Qt3DRender/QRenderSettings.h>
#include <Qt3DRender/QPointLight.h>
#include <Qt3DExtras/QSphereMesh>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DExtras/qforwardrenderer.h>
#include <Qt3DExtras/Qt3DWindow.h>
#include <Qt3DExtras/QFirstPersonCameraController.h>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
auto view = new Qt3DExtras::Qt3DWindow();
view->defaultFrameGraph()->setClearColor(QColor(255,255,255));
auto rootEntity = new Qt3DCore::QEntity();
view->setRootEntity(rootEntity);
auto cameraEntity = view->camera();
cameraEntity->lens()->setPerspectiveProjection(45.0f, 1., 0.1f, 10000.0f);
cameraEntity->setPosition(QVector3D(5, 5, 5));
cameraEntity->setUpVector(QVector3D(0, 1, 0));
cameraEntity->setViewCenter(QVector3D(0, 0, 0));
auto lightEntity = new Qt3DCore::QEntity(rootEntity);
auto light = new Qt3DRender::QPointLight(lightEntity);
light->setColor("white");
light->setIntensity(1);
lightEntity->addComponent(light);
auto lightTransform = new Qt3DCore::QTransform(lightEntity);
lightTransform->setTranslation(cameraEntity->position());
lightEntity->addComponent(lightTransform);
lightEntity->setEnabled(false);
// For camera controls
auto camController = new Qt3DExtras::QFirstPersonCameraController(rootEntity);
camController->setCamera(cameraEntity);
auto mesh = new Qt3DExtras::QSphereMesh();
mesh->setRadius(1.);
auto meshMaterial = new Qt3DExtras::QPhongMaterial();
meshMaterial->setDiffuse(QColor(0, 255, 0));
meshMaterial->setAmbient(QColor(255, 0, 0));
meshMaterial->setSpecular(QColor(0,0,255));
meshMaterial->setShininess(23);
auto meshEntity = new Qt3DCore::QEntity(rootEntity);
meshEntity->addComponent(mesh);
meshEntity->addComponent(meshMaterial);
meshEntity->setEnabled(true);
auto disableLight = new QCheckBox();
auto container = QWidget::createWindowContainer(view);
QFrame frame;
frame.setLayout(new QVBoxLayout);
frame.layout()->addWidget(container);
frame.layout()->addWidget(disableLight);
QObject::connect(disableLight, &QCheckBox::stateChanged, [lightEntity](auto state) {
lightEntity->setEnabled(state == Qt::CheckState::Checked);
});
frame.setFixedSize(500, 500);
frame.show();
return a.exec();
}
答案 0 :(得分:2)
如果在您的Qt3D场景中未创建任何灯光实体,则Qt3D将为您添加一个。这是为了防止用户在没有光照的情况下看不到任何东西。 自己添加灯后,默认灯将被省略
您可以通过添加强度设置为零的光来解决此默认行为:
DirectionalLight {
worldDirection: Qt.vector3d(-1, 1, -1)
intensity: 0.0
}
这将为您带来以下效果: test with cuboid and sphere mesh with PhongMaterial
因此,修改灯光的强度属性可能会提供您想要的东西。