相机远近平面随模型自适应,方向键上下调整相机移动速度

main
wuyize 2024-01-08 15:43:48 +08:00
parent 20114158be
commit 34524a4319
7 changed files with 35 additions and 7 deletions

View File

@ -5,6 +5,7 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include "../util/PaintingUtil.h" #include "../util/PaintingUtil.h"
#include <QStackedwidget>
using namespace Library; using namespace Library;
@ -20,8 +21,6 @@ LibraryWidget::LibraryWidget(QWidget* parent)
connect(ui.classComboBox, &QComboBox::textActivated, this, &LibraryWidget::onClassChanged); connect(ui.classComboBox, &QComboBox::textActivated, this, &LibraryWidget::onClassChanged);
Renderer::PaintingRenderer::instance(); Renderer::PaintingRenderer::instance();
onClassChanged(ui.classComboBox->currentText());
} }
QSize LibraryWidget::getPaintingAdjustedSize(const QString& path) QSize LibraryWidget::getPaintingAdjustedSize(const QString& path)
@ -103,3 +102,13 @@ void Library::LibraryWidget::onClassChanged(const QString& name)
loadingThread = std::jthread([this](std::stop_token stop) {loadIcons(stop); }); loadingThread = std::jthread([this](std::stop_token stop) {loadIcons(stop); });
} }
void Library::LibraryWidget::currentTabChanged(int index)
{
static bool firstChange = true;
if (qobject_cast<QStackedWidget*>(sender())->currentWidget() == this && firstChange)
{
onClassChanged(ui.classComboBox->currentText());
firstChange = false;
}
}

View File

@ -29,6 +29,9 @@ namespace Library
LibraryWidget(QWidget* parent = nullptr); LibraryWidget(QWidget* parent = nullptr);
public slots:
void currentTabChanged(int index);
signals: signals:
void openPaintingFile(QString path); void openPaintingFile(QString path);

View File

@ -21,6 +21,7 @@ CentralWidget::CentralWidget(QWidget* parent) : QWidget(parent)
ui.gridLayout->addWidget(navigationBarWidget, 0, 0, 1, 1, Qt::AlignTop | Qt::AlignHCenter); ui.gridLayout->addWidget(navigationBarWidget, 0, 0, 1, 1, Qt::AlignTop | Qt::AlignHCenter);
QObject::connect(navigationBarWidget->tabs, &QtMaterialTabs::currentChanged, ui.stackedWidget, &QStackedWidget::setCurrentIndex); QObject::connect(navigationBarWidget->tabs, &QtMaterialTabs::currentChanged, ui.stackedWidget, &QStackedWidget::setCurrentIndex);
QObject::connect(ui.stackedWidget, &QStackedWidget::currentChanged, ui.rendererWidget, &Renderer::RendererWidget::currentTabChanged); QObject::connect(ui.stackedWidget, &QStackedWidget::currentChanged, ui.rendererWidget, &Renderer::RendererWidget::currentTabChanged);
QObject::connect(ui.stackedWidget, &QStackedWidget::currentChanged, ui.libraryWidget, &Library::LibraryWidget::currentTabChanged);
QObject::connect(ui.rendererWidget, &Renderer::RendererWidget::openPaintingFile, [&, navigationBarWidget](QString path) { QObject::connect(ui.rendererWidget, &Renderer::RendererWidget::openPaintingFile, [&, navigationBarWidget](QString path) {
navigationBarWidget->tabs->setCurrentTab(0); navigationBarWidget->tabs->setCurrentTab(0);
ui.stackedWidget->setCurrentWidget(ui.editorWidget); ui.stackedWidget->setCurrentWidget(ui.editorWidget);

View File

@ -5,6 +5,12 @@ Light::Light(Camera* camera)
: camera(camera) : camera(camera)
//, shadowCascadeLevels{ camera->FarPlane / 25.0f, camera->FarPlane / 12.0f, camera->FarPlane / 6.0f, camera->FarPlane / 3.0f } //, shadowCascadeLevels{ camera->FarPlane / 25.0f, camera->FarPlane / 12.0f, camera->FarPlane / 6.0f, camera->FarPlane / 3.0f }
{ {
updateShadowCascadeLevels();
}
void Renderer::Light::updateShadowCascadeLevels()
{
shadowCascadeLevels.clear();
const float levelCount = 5; const float levelCount = 5;
const float lambda = 0.5; const float lambda = 0.5;
for (int i = 1; i < levelCount; i++) for (int i = 1; i < levelCount; i++)

View File

@ -20,6 +20,7 @@ namespace Renderer
std::vector<float> frustumSizes; std::vector<float> frustumSizes;
Model* model = nullptr; Model* model = nullptr;
Light(Camera* camera); Light(Camera* camera);
void updateShadowCascadeLevels();
std::vector<QVector4D> getFrustumCornersWorldSpace(const QMatrix4x4& projview); std::vector<QVector4D> getFrustumCornersWorldSpace(const QMatrix4x4& projview);
std::vector<QVector4D> getFrustumCornersWorldSpace(const QMatrix4x4& proj, const QMatrix4x4& view); std::vector<QVector4D> getFrustumCornersWorldSpace(const QMatrix4x4& proj, const QMatrix4x4& view);
QMatrix4x4 getLightSpaceMatrix(const float nearPlane, const float farPlane); QMatrix4x4 getLightSpaceMatrix(const float nearPlane, const float farPlane);

View File

@ -19,6 +19,8 @@ namespace Renderer
std::vector<QVector3D> AABB; std::vector<QVector3D> AABB;
glm::vec3 minPos = glm::vec3(std::numeric_limits<float>::max());
glm::vec3 maxPos = glm::vec3(std::numeric_limits<float>::min());
private: private:
QOpenGLContext* context = nullptr; QOpenGLContext* context = nullptr;
QOpenGLFunctions_4_5_Core* glFunc = nullptr; QOpenGLFunctions_4_5_Core* glFunc = nullptr;
@ -39,8 +41,6 @@ namespace Renderer
QDir directory; /// 模型所在路径 QDir directory; /// 模型所在路径
QString name; /// 模型文件名 QString name; /// 模型文件名
glm::vec3 minPos = glm::vec3(std::numeric_limits<float>::max());
glm::vec3 maxPos = glm::vec3(std::numeric_limits<float>::min());
/// 递归遍历结点 /// 递归遍历结点
void processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4 = aiMatrix4x4()); void processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4 = aiMatrix4x4());

View File

@ -84,8 +84,12 @@ void RendererGLWidget::setModel(QString path)
//model->loadModel("Models/Sponza/Sponza.gltf"); //model->loadModel("Models/Sponza/Sponza.gltf");
//model->loadModel("E:\\3D Objects\\Gate\\gltf\\Gate.gltf"); //model->loadModel("E:\\3D Objects\\Gate\\gltf\\Gate.gltf");
model->loadModel(path); model->loadModel(path);
light.model = model;
qDebug() << model->AABB; qDebug() << model->AABB;
light.model = model;
auto extent = model->maxPos - model->minPos;
camera.FarPlane = glm::sqrt(extent.x * extent.x + extent.y * extent.y + extent.z * extent.z);
camera.NearPlane = camera.FarPlane / 500.f;
light.updateShadowCascadeLevels();
doneCurrent(); doneCurrent();
} }
@ -689,6 +693,10 @@ void RendererGLWidget::keyPressEvent(QKeyEvent* event)
{ {
if (event->key() == Qt::Key_Escape) if (event->key() == Qt::Key_Escape)
clearFocus(); clearFocus();
else if (event->key() == Qt::Key_Up)
camera.MovementSpeed += 50;
else if (event->key() == Qt::Key_Down)
camera.MovementSpeed = glm::max(50.f, camera.MovementSpeed - 50);
else if (!event->isAutoRepeat()) else if (!event->isAutoRepeat())
pressedKeys.insert(event->key()); pressedKeys.insert(event->key());
QOpenGLWidget::keyPressEvent(event); QOpenGLWidget::keyPressEvent(event);