我试图再次调用 paintGL() 来绘制其他东西,但是 update() 被忽略了,我不知道为什么。 (我调试了代码并确认了)。
我也已经尝试过 QOpenGLWidget::update(),但还是一样。
在这种情况下,我正在加载 obj 文件,当我双击 listWidget 中的索引时,会上传新的索引,但不起作用。
#include "modeldisplay.h"
#include <modeldata.h>
#include <QMouseEvent>
#include <QOpenGLContext>
#include <QDir>
#include <model.h>
modelDisplay::modelDisplay(QWidget* parent): QOpenGLWidget(parent)
{
m_z = -400.0f;
}
modelDisplay::~modelDisplay()
{
}
void modelDisplay::reload()
{
loadOBJ("new obj file to update the screen");
update();
}
void modelDisplay::initializeGL()
{
glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
initShaders();
loadOBJ("default obj");
}
void modelDisplay::resizeGL(int w, int h)
{
float aspect = w / (float)h;
m_projectionMatrix.setToIdentity();
m_projectionMatrix.perspective(45, aspect, 1.0f, 5000.0f);
}
void modelDisplay::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
QMatrix4x4 viewMatrix;
viewMatrix.setToIdentity();
viewMatrix.translate(0.0, 0.0, m_z);
viewMatrix.translate(m_translation);
viewMatrix.rotate(m_rotation);
m_program.bind();
m_program.setUniformValue("u_projectionMatrix", m_projectionMatrix);
m_program.setUniformValue("u_viewMatrix", viewMatrix);
m_program.setUniformValue("u_lightPosition", QVector4D(0.0, 0.0, 0.0, 1.0));
m_program.setUniformValue("u_lightPower", 0.4f);
for (int i = 0; i < m_objects.size(); ++i)
{
m_objects[i]->draw(&m_program, context()->functions());
}
}
void modelDisplay::initShaders()
{
if(!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/vshader.vsh")) close();
if(!m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fshader.fsh")) close();
if(!m_program.link()) close();
}
void modelDisplay::loadOBJ(const QString &path)
{
QFile file(path);
if(!file.exists()) return;
file.open(QIODevice::ReadOnly);
QTextStream input(&file);
QVector<QVector3D> coords;
QVector<QVector2D> texCoord;
QVector<QVector3D> normals;
QVector <VertexData> vertexes;
QVector <GLuint> indexes;
while(!input.atEnd())
{
QString str = input.readLine();
QStringList list = str.split(" ");
if(list[0] == "v")
{
coords.append(QVector3D(list[1].toFloat(), list[2].toFloat(),list[3].toFloat()));
continue;
}
else if(list[0] == "vt")
{
texCoord.append(QVector2D(list[1].toFloat(), list[2].toFloat()));
continue;
}
else if(list[0] == "vn")
{
normals.append(QVector3D(list[1].toFloat(), list[2].toFloat(), list[3].toFloat()));
continue;
}
else if(list[0] == "f")
{
for(int i = 1; i <= 3; ++i)
{
QStringList vert = list[i].split("/");
vertexes.append(VertexData(coords[vert[0].toLong() - 1], texCoord[vert[1].toLong() - 1], normals[vert[2].toLong() - 1]));
indexes.append(indexes.size());
}
continue;
break;
}
}
file.close();
m_objects.append(new modelData(vertexes, indexes, QImage(":/resources/Images/lightGrey.png")));
}
void modelDisplay::mousePressEvent(QMouseEvent *event)
{
if(event->buttons() == Qt::LeftButton)
{
m_mousePosition = QVector2D(event->localPos());
}
else if (event->buttons() == Qt::RightButton)
{
m_mousePosition = QVector2D(event->localPos());
}
event->accept();
}
void modelDisplay::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() == Qt::LeftButton)
{
QVector2D diff = QVector2D(event->localPos()) - m_mousePosition;
m_mousePosition = QVector2D(event->localPos());
float angle = diff.length() / 2.0;
QVector3D axis = QVector3D(diff.y(), diff.x(), 0.0);
m_rotation = QQuaternion::fromAxisAndAngle(axis, angle) * m_rotation;
update();
}
else if (event->buttons() == Qt::RightButton)
{
QVector2D diff = QVector2D(event->localPos()) - m_mousePosition;
m_mousePosition = QVector2D(event->localPos());
QVector3D trans(diff.x(), -diff.y(), 0.0);
trans *= 0.5f;
m_translation += trans;
update();
}
}
void modelDisplay::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)
{
m_z -= 20.0f;
}
else if (event->delta() < 0)
{
m_z += 20.0f;
}
update();
}