我有一个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轴旋转,如果我水平向左拖动,则具有负角度。
这对于垂直拖动是相同的,但旋转将沿牛轴。
这个问题来自全球坐标?但是,event->x
和event->y
给出了相对于Glwidget的位置。
您在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,似乎与您的用例相符。