aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Doan <daviddoan@Davids-MacBook-Pro-100.local>2023-12-08 15:04:09 -0500
committerDavid Doan <daviddoan@Davids-MacBook-Pro-100.local>2023-12-08 15:04:09 -0500
commita44bcf18656062785c89e8fde25c232431b0d585 (patch)
tree5bcc3c702eb4568353c614c9b0c5d48fdbb8f223 /src
parente82bbe93fbca3fdb3d77e33bfc0b7c957fbe2f87 (diff)
camera movement
Diffstat (limited to 'src')
-rw-r--r--src/camera/camera.cpp31
-rw-r--r--src/camera/camera.h3
-rw-r--r--src/mainwindow.cpp73
-rw-r--r--src/mainwindow.h5
-rw-r--r--src/settings.h1
5 files changed, 75 insertions, 38 deletions
diff --git a/src/camera/camera.cpp b/src/camera/camera.cpp
index 62e8021..b63164b 100644
--- a/src/camera/camera.cpp
+++ b/src/camera/camera.cpp
@@ -1,5 +1,6 @@
#include <stdexcept>
#include "camera.h"
+#include "4dvecops/vec4ops.h"
Camera::Camera(SceneCameraData cameraData) :
m_pos(cameraData.pos),
@@ -7,33 +8,11 @@ Camera::Camera(SceneCameraData cameraData) :
m_focalLength(cameraData.focalLength),
m_aperture(cameraData.aperture)
{
- // VIEW MATRIX INTIALIZATION
- // cast to 3 for dots & cross
- glm::vec3 look3{cameraData.look.x, cameraData.look.y, cameraData.look.z};
- glm::vec3 up3{cameraData.up.x, cameraData.up.y, cameraData.up.z};
+ m_viewMatrix = Vec4Ops::getViewMatrix4(cameraData.pos, glm::vec4(0.f), cameraData.up, cameraData.look);
+ m_translationVector = glm::vec4{-cameraData.pos.x, -cameraData.pos.y, -cameraData.pos.z, -cameraData.pos.w};
- // calculate new basis
- glm::vec3 e0 = -glm::normalize(look3);
- glm::vec3 e1 = glm::normalize(up3 - glm::dot(up3, e0) * e0);
- glm::vec3 e2 = glm::cross(e1, e0);
-
- glm::mat4 alignment
- {
- e2.x, e1.x, e0.x, 0.f,
- e2.y, e1.y, e0.y, 0.f,
- e2.z, e1.z, e0.z, 0.f,
- 0.f, 0.f, 0.f, 1.f
- };
- glm::mat4 translation
- {
- 1.f, 0.f, 0.f, 0.f,
- 0.f, 1.f, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- -cameraData.pos.x, -cameraData.pos.y, -cameraData.pos.z, 1.f
- };
-
- m_viewMatrix = alignment * translation;
- m_inverse = glm::inverse(m_viewMatrix);
+ m_inverseViewMatrix = glm::inverse(m_viewMatrix);
+ m_inverseTranslationVector = -m_translationVector;
}
diff --git a/src/camera/camera.h b/src/camera/camera.h
index e0cd013..4fa9ab0 100644
--- a/src/camera/camera.h
+++ b/src/camera/camera.h
@@ -45,5 +45,8 @@ private:
float m_focalLength;
float m_aperture;
+
+ glm::vec4 m_translationVector;
+ glm::vec4 m_inverseTranslationVector;
};
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 5da720b..088fa1c 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -43,6 +43,9 @@ void MainWindow::initialize() {
QLabel *zw_label = new QLabel(); // ZW label
zw_label->setText("ZW value:");
zw_label->setFont(font);
+ QLabel *w_label = new QLabel(); // W label
+ w_label->setText("W value:");
+ w_label->setFont(font);
QLabel *rotation_label = new QLabel(); // Rotation label
rotation_label->setText("Rotation value:");
@@ -61,12 +64,12 @@ void MainWindow::initialize() {
xySlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider
xySlider->setTickInterval(1);
- xySlider->setMinimum(-36000);
+ xySlider->setMinimum(0);
xySlider->setMaximum(36000);
xySlider->setValue(0);
xyBox = new QDoubleSpinBox();
- xyBox->setMinimum(-360.0f);
+ xyBox->setMinimum(0.0f);
xyBox->setMaximum(360.f);
xyBox->setSingleStep(1.f);
xyBox->setValue(0.f);
@@ -81,12 +84,12 @@ void MainWindow::initialize() {
xzSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider
xzSlider->setTickInterval(1);
- xzSlider->setMinimum(-36000);
+ xzSlider->setMinimum(0);
xzSlider->setMaximum(36000);
xzSlider->setValue(0);
xzBox = new QDoubleSpinBox();
- xzBox->setMinimum(-360.0f);
+ xzBox->setMinimum(0.0f);
xzBox->setMaximum(360.f);
xzBox->setSingleStep(1.f);
xzBox->setValue(0.f);
@@ -101,12 +104,12 @@ void MainWindow::initialize() {
xwSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider
xwSlider->setTickInterval(1);
- xwSlider->setMinimum(-36000);
+ xwSlider->setMinimum(0);
xwSlider->setMaximum(36000);
xwSlider->setValue(0);
xwBox = new QDoubleSpinBox();
- xwBox->setMinimum(-360.0f);
+ xwBox->setMinimum(0.0f);
xwBox->setMaximum(360.f);
xwBox->setSingleStep(1.f);
xwBox->setValue(0.f);
@@ -121,12 +124,12 @@ void MainWindow::initialize() {
yzSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider
yzSlider->setTickInterval(1);
- yzSlider->setMinimum(-36000);
+ yzSlider->setMinimum(0);
yzSlider->setMaximum(36000);
yzSlider->setValue(0);
yzBox = new QDoubleSpinBox();
- yzBox->setMinimum(-360.0f);
+ yzBox->setMinimum(0.0f);
yzBox->setMaximum(360.f);
yzBox->setSingleStep(1.f);
yzBox->setValue(0.f);
@@ -141,12 +144,12 @@ void MainWindow::initialize() {
ywSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider
ywSlider->setTickInterval(1);
- ywSlider->setMinimum(-36000);
+ ywSlider->setMinimum(0);
ywSlider->setMaximum(36000);
ywSlider->setValue(0);
ywBox = new QDoubleSpinBox();
- ywBox->setMinimum(-360.0f);
+ ywBox->setMinimum(0.0f);
ywBox->setMaximum(360.f);
ywBox->setSingleStep(1.f);
ywBox->setValue(0.f);
@@ -161,12 +164,12 @@ void MainWindow::initialize() {
zwSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider
zwSlider->setTickInterval(1);
- zwSlider->setMinimum(-36000);
+ zwSlider->setMinimum(0);
zwSlider->setMaximum(36000);
zwSlider->setValue(0);
zwBox = new QDoubleSpinBox();
- zwBox->setMinimum(-360.0f);
+ zwBox->setMinimum(0.0f);
zwBox->setMaximum(360.f);
zwBox->setSingleStep(1.f);
zwBox->setValue(0.f);
@@ -200,6 +203,27 @@ void MainWindow::initialize() {
rotateNegative->setText(QStringLiteral("Reverse Rotation"));
rotateNegative->setChecked(false);
+ // w Slider
+ QGroupBox *wLayout = new QGroupBox(); // horizonal w slider alignment
+ QHBoxLayout *lw = new QHBoxLayout();
+
+ wSlider = new QSlider(Qt::Orientation::Horizontal); // XY value slider
+ wSlider->setTickInterval(1);
+ wSlider->setMinimum(-5000);
+ wSlider->setMaximum(5000);
+ wSlider->setValue(0);
+
+ wBox = new QDoubleSpinBox();
+ wBox->setMinimum(-50.0f);
+ wBox->setMaximum(50.f);
+ wBox->setSingleStep(1.f);
+ wBox->setValue(0.f);
+
+ lw->addWidget(wSlider);
+ lw->addWidget(wBox);
+ wLayout->setLayout(lw);
+
+
vLayout->addWidget(uploadFile);
vLayout->addWidget(saveImage);
vLayout->addWidget(xy_label);
@@ -214,11 +238,14 @@ void MainWindow::initialize() {
vLayout->addWidget(ywLayout);
vLayout->addWidget(zw_label);
vLayout->addWidget(zwLayout);
+ vLayout->addWidget(w_label);
+ vLayout->addWidget(wLayout);
vLayout->addWidget(rotation_label);
vLayout->addWidget(rotationLayout);
vLayout->addWidget(rotateNegative);
+
connectUIElements();
onValChangexyBox(0.0f);
@@ -228,6 +255,7 @@ void MainWindow::initialize() {
onValChangeywBox(0.0f);
onValChangezwBox(0.0f);
onValChangeRotationBox(1.0f);
+ onValChangeWBox(0.0f);
}
void MainWindow::finish() {
@@ -252,6 +280,7 @@ void MainWindow::connectUIElements() {
connect(rayTracer, &RayTracer::yzRotationChanged, this, &MainWindow::updateYzSlider);
connect(rayTracer, &RayTracer::ywRotationChanged, this, &MainWindow::updateYwSlider);
connect(rayTracer, &RayTracer::zwRotationChanged, this, &MainWindow::updateZwSlider);
+ connectW();
}
void MainWindow::connectUploadFile() {
@@ -308,6 +337,12 @@ void MainWindow::connectNegativeRotation() {
connect(rotateNegative, &QCheckBox::clicked, this, &MainWindow::onRotateNegative);
}
+void MainWindow::connectW() {
+ connect(wSlider, &QSlider::valueChanged, this, &MainWindow::onValChangeWSlider);
+ connect(wBox, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
+ this, &MainWindow::onValChangeWBox);
+}
+
void MainWindow::onUploadFile() {
// Get abs path of scene file
QString configFilePath = QFileDialog::getOpenFileName(this, tr("Upload File"),
@@ -449,6 +484,20 @@ void MainWindow::onValChangeRotationBox(double newValue) {
rayTracer->settingsChanged(imageLabel);
}
+void MainWindow::onValChangeWSlider(int newValue) {
+ //wSlider->setValue(newValue);
+ wBox->setValue(newValue/100.f);
+ settings.w = wBox->value();
+ rayTracer->settingsChanged(imageLabel);
+}
+
+void MainWindow::onValChangeWBox(double newValue) {
+ wSlider->setValue(int(newValue*100.f));
+ //wBox->setValue(newValue);
+ settings.w = wBox->value();
+ rayTracer->settingsChanged(imageLabel);
+}
+
void MainWindow::onRotateNegative() {
settings.negative = !settings.negative;
}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 35498ee..986a911 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -32,6 +32,7 @@ private:
void connectzw();
void connectRotationSlider();
void connectNegativeRotation();
+ void connectW();
RayTracer *rayTracer;
AspectRatioWidget *aspectRatioWidget;
@@ -52,6 +53,8 @@ private:
QSlider *rotationSlider;
QDoubleSpinBox *rotationBox;
QCheckBox *rotateNegative;
+ QSlider *wSlider;
+ QDoubleSpinBox *wBox;
private slots:
@@ -78,4 +81,6 @@ private slots:
void updateYzSlider(double newValue);
void updateYwSlider(double newValue);
void updateZwSlider(double newValue);
+ void onValChangeWSlider(int newValue);
+ void onValChangeWBox(double newValue);
};
diff --git a/src/settings.h b/src/settings.h
index f114226..0bf4dcc 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -14,6 +14,7 @@ struct Settings {
float zw = 0.f;
float rotation = 1.f;
bool negative = false;
+ float w = 0.f;
};