From e863c68a7711d535d68f918ee704486456a6c685 Mon Sep 17 00:00:00 2001 From: Anakin Date: Fri, 30 Dec 2016 13:28:07 +0100 Subject: [PATCH] added movement and zoom --- QtMeshViewer/Header/OglViewerWidget.h | 2 + QtMeshViewer/Source/GeometryEngine.cpp | 114 ++++++++++++------------ QtMeshViewer/Source/OglViewerWidget.cpp | 32 ++++++- 3 files changed, 88 insertions(+), 60 deletions(-) diff --git a/QtMeshViewer/Header/OglViewerWidget.h b/QtMeshViewer/Header/OglViewerWidget.h index 9763748..45a291f 100644 --- a/QtMeshViewer/Header/OglViewerWidget.h +++ b/QtMeshViewer/Header/OglViewerWidget.h @@ -32,12 +32,14 @@ private: GeometryEngine *m_dataEngine; QMatrix4x4 m_projection; + QVector3D m_translation; QQuaternion m_rotation; protected: void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE; void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE; void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE; + void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE; void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE; void initializeGL() Q_DECL_OVERRIDE; diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp index 2763d48..670762d 100644 --- a/QtMeshViewer/Source/GeometryEngine.cpp +++ b/QtMeshViewer/Source/GeometryEngine.cpp @@ -50,75 +50,75 @@ void GeometryEngine::initCubeGeometry() auto msg = e.what(); } - // Transfer vertex data to VBO 0 - m_arrayBuf.bind(); - m_arrayBuf.allocate(m_models->first()->segmList.front()->vertices.data(), m_models->first()->segmList.front()->vertices.size() * sizeof(VertexData)); + QVector vertices = { + // Vertex data for face 0 + {QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(0.0f, 0.0f)}, // v0 + {QVector3D( 1.0f, -1.0f, 1.0f), QVector2D(0.33f, 0.0f)}, // v1 + {QVector3D(-1.0f, 1.0f, 1.0f), QVector2D(0.0f, 0.5f)}, // v2 + {QVector3D( 1.0f, 1.0f, 1.0f), QVector2D(0.33f, 0.5f)}, // v3 - // Transfer index data to VBO 1 - m_indexBuf.bind(); - m_indexBuf.allocate(m_models->first()->segmList.front()->indices.data(), m_models->first()->segmList.front()->indices.size() * sizeof(GLushort)); + // Vertex data for face 1 + {QVector3D( 1.0f, -1.0f, 1.0f), QVector2D( 0.0f, 0.5f)}, // v4 + {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.5f)}, // v5 + {QVector3D( 1.0f, 1.0f, 1.0f), QVector2D(0.0f, 1.0f)}, // v6 + {QVector3D( 1.0f, 1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v7 + // Vertex data for face 2 + {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v8 + {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(1.0f, 0.5f)}, // v9 + {QVector3D( 1.0f, 1.0f, -1.0f), QVector2D(0.66f, 1.0f)}, // v10 + {QVector3D(-1.0f, 1.0f, -1.0f), QVector2D(1.0f, 1.0f)}, // v11 - //QVector vertices = { - // // Vertex data for face 0 - // {QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(0.0f, 0.0f)}, // v0 - // {QVector3D( 1.0f, -1.0f, 1.0f), QVector2D(0.33f, 0.0f)}, // v1 - // {QVector3D(-1.0f, 1.0f, 1.0f), QVector2D(0.0f, 0.5f)}, // v2 - // {QVector3D( 1.0f, 1.0f, 1.0f), QVector2D(0.33f, 0.5f)}, // v3 + // Vertex data for face 3 + {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v12 + {QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(1.0f, 0.0f)}, // v13 + {QVector3D(-1.0f, 1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v14 + {QVector3D(-1.0f, 1.0f, 1.0f), QVector2D(1.0f, 0.5f)}, // v15 - // // Vertex data for face 1 - // {QVector3D( 1.0f, -1.0f, 1.0f), QVector2D( 0.0f, 0.5f)}, // v4 - // {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.5f)}, // v5 - // {QVector3D( 1.0f, 1.0f, 1.0f), QVector2D(0.0f, 1.0f)}, // v6 - // {QVector3D( 1.0f, 1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v7 + // Vertex data for face 4 + {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.0f)}, // v16 + {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v17 + {QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(0.33f, 0.5f)}, // v18 + {QVector3D( 1.0f, -1.0f, 1.0f), QVector2D(0.66f, 0.5f)}, // v19 - // // Vertex data for face 2 - // {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v8 - // {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(1.0f, 0.5f)}, // v9 - // {QVector3D( 1.0f, 1.0f, -1.0f), QVector2D(0.66f, 1.0f)}, // v10 - // {QVector3D(-1.0f, 1.0f, -1.0f), QVector2D(1.0f, 1.0f)}, // v11 + // Vertex data for face 5 + {QVector3D(-1.0f, 1.0f, 1.0f), QVector2D(0.33f, 0.5f)}, // v20 + {QVector3D( 1.0f, 1.0f, 1.0f), QVector2D(0.66f, 0.5f)}, // v21 + {QVector3D(-1.0f, 1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v22 + {QVector3D( 1.0f, 1.0f, -1.0f), QVector2D(0.66f, 1.0f)} // v23 + }; - // // Vertex data for face 3 - // {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v12 - // {QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(1.0f, 0.0f)}, // v13 - // {QVector3D(-1.0f, 1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v14 - // {QVector3D(-1.0f, 1.0f, 1.0f), QVector2D(1.0f, 0.5f)}, // v15 - - // // Vertex data for face 4 - // {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.0f)}, // v16 - // {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v17 - // {QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(0.33f, 0.5f)}, // v18 - // {QVector3D( 1.0f, -1.0f, 1.0f), QVector2D(0.66f, 0.5f)}, // v19 - - // // Vertex data for face 5 - // {QVector3D(-1.0f, 1.0f, 1.0f), QVector2D(0.33f, 0.5f)}, // v20 - // {QVector3D( 1.0f, 1.0f, 1.0f), QVector2D(0.66f, 0.5f)}, // v21 - // {QVector3D(-1.0f, 1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v22 - // {QVector3D( 1.0f, 1.0f, -1.0f), QVector2D(0.66f, 1.0f)} // v23 - // }; - - //QVector indices = { - // 0,1,2, //vorne (4) - // 3,2,1, - // 4,5,7, //rechts (1) - // 6,4,7, - // 8,9,11, //hinten (3)* - // 8,11,10, - // 14,12,13, //links (6)* - // 14,13,15, - // 18,16,17, //unten (5) - // 19,18,17, - // 23,22,20, //oben (2)* - // 23,20,21 - //}; + QVector indices = { + 0,1,2, //vorne (4) + 3,2,1, + 4,5,7, //rechts (1) + 6,4,7, + 8,9,11, //hinten (3)* + 8,11,10, + 14,12,13, //links (6)* + 14,13,15, + 18,16,17, //unten (5) + 19,18,17, + 23,22,20, //oben (2)* + 23,20,21 + }; //// Transfer vertex data to VBO 0 //m_arrayBuf.bind(); - //m_arrayBuf.allocate(vertices.data(), vertices.size() * sizeof(VertexData)); + //m_arrayBuf.allocate(m_models->first()->segmList.front()->vertices.data(), m_models->first()->segmList.front()->vertices.size() * sizeof(VertexData)); //// Transfer index data to VBO 1 //m_indexBuf.bind(); - //m_indexBuf.allocate(indices.data(), indices.size() * sizeof(GLushort)); + //m_indexBuf.allocate(m_models->first()->segmList.front()->indices.data(), m_models->first()->segmList.front()->indices.size() * sizeof(GLushort)); + + + // Transfer vertex data to VBO 0 + m_arrayBuf.bind(); + m_arrayBuf.allocate(vertices.data(), vertices.size() * sizeof(VertexData)); + + // Transfer index data to VBO 1 + m_indexBuf.bind(); + m_indexBuf.allocate(indices.data(), indices.size() * sizeof(GLushort)); // load the texture initTexture(); diff --git a/QtMeshViewer/Source/OglViewerWidget.cpp b/QtMeshViewer/Source/OglViewerWidget.cpp index a5fa522..2132c3e 100644 --- a/QtMeshViewer/Source/OglViewerWidget.cpp +++ b/QtMeshViewer/Source/OglViewerWidget.cpp @@ -2,6 +2,9 @@ #include #include +#include + +#define DEFAULT_Z_DISTANCE -5.0 ///////////////////////////////////////////////////////////////////////// @@ -12,6 +15,7 @@ OglViewerWidget::OglViewerWidget(QWidget *parent) : m_dataEngine(0) { setFocus(); + m_translation.setZ(DEFAULT_Z_DISTANCE); } OglViewerWidget::~OglViewerWidget() @@ -63,13 +67,35 @@ void OglViewerWidget::mouseMoveEvent(QMouseEvent *e) // request an update update(); } + else if (m_mouse.right) + { + // get the difference between last press and now + QVector2D diff = QVector2D(e->localPos()) - m_mouse.position; + + // update the new position + m_mouse.position = QVector2D(e->localPos()); + + // calculate the translation + m_translation += {(float)(diff.x() * 0.01), (float)(diff.y() * -0.01), 0.0}; + + // request an update + update(); + } +} + +void OglViewerWidget::wheelEvent(QWheelEvent *e) +{ + m_translation += {0.0, 0.0, (float)e->angleDelta().y() / 240}; + update(); } void OglViewerWidget::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Space) + { m_rotation = QQuaternion(); - + m_translation = { 0.0, 0.0, DEFAULT_Z_DISTANCE }; + } update(); } @@ -97,7 +123,7 @@ void OglViewerWidget::resizeGL(int w, int h) qreal aspect = qreal(w) / qreal(h ? h : 1); // Set near plane to 3.0, far plane to 7.0, field of view 45 degrees - const qreal zNear = 3.0, zFar = 7.0, fov = 45.0; + const qreal zNear = 0.1, zFar = 100.0, fov = 45.0; // Reset projection m_projection.setToIdentity(); @@ -113,7 +139,7 @@ void OglViewerWidget::paintGL() // Calculate model view transformation QMatrix4x4 view; - view.translate(0.0, 0.0, -5.0); + view.translate(m_translation); view.rotate(m_rotation); // Set modelview-projection matrix