我有一个QGLWidget的GLWdiget子类,我想沿着Ox和Oy轴旋转一个3D对象。
为此,我以这种方式重新实现了mousePressEvent
和mouseMoveEvent
功能:
void GLWidget::mousePressEvent(QMouseEvent *event)
{
lastPos = event->pos();
}
void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
float dx = (event->x() - lastPos.x()) / 10.0f;
float dy = (event->y() - lastPos.y())/ 10.0f;
if (event->buttons() & Qt::LeftButton)
{
glRotatef(dy*0.1, 1.0f, 0.0f, 0.0f);
glRotatef(dx*0.1, 0.0f, 1.0f, 0.0f);
}
}
我的问题是dx
和dy
永远不会是负面的,所以无论我对鼠标做什么方向,它总是朝同一方向旋转。
例如,如果我向右水平拖动,我希望对象沿着0y轴以正角度旋转,如果我向左水平拖动,则以负角度旋转。
对于垂直拖动,这将是相同的,但旋转将沿着Ox轴。
此问题是否来自全球坐标?但是,event->x
和event->y
会给出相对于GLWidget的位置。
答案 0 :(得分:4)
您是不是在mouseMoveEvent结束时更新lastPos? 从Qt例子:
void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
int dx = event->x() - lastPos.x();
int dy = event->y() - lastPos.y();
if (event->buttons() & Qt::LeftButton) {
setXRotation(xRot + 8 * dy);
setYRotation(yRot + 8 * dx);
} else if (event->buttons() & Qt::RightButton) {
setXRotation(xRot + 8 * dy);
setZRotation(zRot + 8 * dx);
}
lastPos = event->pos();
}
我建议您查看Qt Hello GL,这似乎与您的用例相符。