我有一个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的位置。
发布于 2012-12-21 21:28:50
您不会在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,它看起来很符合你的用例。
https://stackoverflow.com/questions/13997250
复制相似问题