83 lines
1.5 KiB
C++
83 lines
1.5 KiB
C++
#include "..\Header\MoveCamera.h"
|
|
#include <QVector2D>
|
|
#include <qmath.h>
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// constructor/destructor
|
|
|
|
MoveCamera::MoveCamera()
|
|
{
|
|
resetView();
|
|
}
|
|
|
|
MoveCamera::~MoveCamera()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// functions
|
|
|
|
void MoveCamera::rotateAction(QVector2D diff)
|
|
{
|
|
m_phi -= diff.x() * 0.01;
|
|
m_theta += diff.y() * 0.01;
|
|
|
|
m_theta = qMax(qMin(M_PI - 0.0001, m_theta), 0.0001);
|
|
}
|
|
|
|
void MoveCamera::moveAction(QVector2D diff)
|
|
{
|
|
if (diff.y() > 0)
|
|
m_sidewardSpeed = 1;
|
|
else if (diff.y() < 0)
|
|
m_sidewardSpeed = -1;
|
|
else
|
|
m_sidewardSpeed = 0;
|
|
}
|
|
|
|
void MoveCamera::wheelAction(double value)
|
|
{
|
|
if (value > 0)
|
|
m_forwardSpeed = 1;
|
|
else if (value < 0)
|
|
m_forwardSpeed = -1;
|
|
else
|
|
m_forwardSpeed = 0;
|
|
}
|
|
|
|
void MoveCamera::recalculateMatrix()
|
|
{
|
|
m_matrix = QMatrix4x4();
|
|
|
|
// different coordinate (spherical -> world) X->Z | Y->X | Z->Y
|
|
QVector3D tmpdirection(
|
|
qSin(m_theta) * qSin(m_phi),
|
|
qCos(m_theta),
|
|
qSin(m_theta) * qCos(m_phi)
|
|
);
|
|
|
|
QVector3D tmpRight(
|
|
qSin(m_phi - M_PI_2),
|
|
0,
|
|
qCos(m_phi - M_PI_2)
|
|
);
|
|
|
|
m_position += m_forwardSpeed * m_zSpeed * 0.1 * tmpdirection;
|
|
m_position += m_sidewardSpeed * m_zSpeed * 0.1 * tmpRight;
|
|
|
|
m_matrix.lookAt(m_position, m_position + tmpdirection, QVector3D::crossProduct(tmpRight, tmpdirection));
|
|
}
|
|
|
|
void MoveCamera::resetView()
|
|
{
|
|
m_position = { 0,0,4 };
|
|
m_phi = M_PI;
|
|
m_theta = M_PI_2;
|
|
m_forwardSpeed = 0;
|
|
m_sidewardSpeed = 0;
|
|
CameraInterface::resetView();
|
|
}
|