【发布时间】:2013-07-20 16:16:00
【问题描述】:
我正在尝试使用鼠标在 3D 空间中移动 3D 对象。
所以,我检索实际矩阵并使用 gluUnProject(将窗口坐标映射到对象坐标)从鼠标位置 dx 和 dy 获取实际的 x、y、z。
按照设计,我的项目有 3 个函数来翻译对象,每个轴一个。所以每次发生像“mouseMoveEvent”这样的事件时,它都会发出一个信号“mouseHasMoved(x,y,z)”(x,y,z 从gluunproject 并按比例缩小)。
这个信号(基于 QT)被调用我上面提到的三个方法的控制器捕获。
因为它是有效的,但是有很多滞后,并且移动不精确。选择的对象往往离它应该停留的平行计划更远。
这里是'mouseMoveEvent'的示例代码:
if (event->buttons() & Qt::RightButton) {
gluUnProject(event->x(), -event->y(), 0, model_matrix, proj_matrix, view_matrix, &newx, &newy, &newz);
if (event->x()>lastPos.x()){
emit SignalPreviewMouseXChanged((float)(newx/1000));
emit SignalPreviewMouseZChanged((float)(-newz/1000));
}
else {
emit SignalPreviewMouseXChanged((float)(-newx/1000));
emit SignalPreviewMouseZChanged((float)(newz/1000));
}
if (event->y()<lastPos.y())
emit SignalPreviewMouseYChanged((float)(newy/500));
else {
emit SignalPreviewMouseYChanged((float)(-newy/500));
}
}
lastPos = event->pos();
updateGL();
其中 objCamera->mPos 是相机位置。
这会为 gluUnProject() 设置矩阵
void setMatrixes()
{
glGetDoublev(GL_MODELVIEW_MATRIX, model_matrix);
glGetDoublev(GL_PROJECTION_MATRIX, proj_matrix);
glGetIntegerv(GL_VIEWPORT, view_matrix);
}
相同的翻译函数与 3 个 QSlider (x,y,z) 链接,它们准确快速。所以这不是函数问题。这是捕获信号时调用的方法的一个示例
void SlotZRotationValueChanged(float val){
sceneRef->translate(0,0,tValue*10);
facade->window->getPreview()->RebuildScene();
}
问题是:我所做的在逻辑上是正确的吗?
【问题讨论】: