gpt4 book ai didi

c++ - 将 gluUnProject 用于在 3D 空间中移动的对象时滞后和缺乏准确性

转载 作者:行者123 更新时间:2023-11-28 07:32:21 25 4
gpt4 key购买 nike

我正在尝试使用鼠标在 3D 空间中移动 3D 对象。

因此,我检索实际矩阵并使用 gluUnProject(将窗口坐标映射到对象坐标)从鼠标位置 dx 和 dy 获取实际的 x、y、z。

根据设计,我的项目有 3 个函数来平移对象,每个轴一个。所以每次发生像“mouseMoveEvent”这样的事件时,它都会发出一个信号“mouseHasMoved(x,y,z)”(x,y,z 从gluunproject 并按比例缩小)。

此信号(基于 QT)由调用我上面提到的三种方法的 Controller 捕获。

因为它是有效的,但是有很多滞后,并且运动不精确。选择的对象往往会远离它应该停留的平行计划。

这里是'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 个 QSliders (x,y,z) 链接,它们准确且快速。所以这不是功能问题。这是捕获信号时调用的方法之一的示例

void SlotZRotationValueChanged(float val){
sceneRef->translate(0,0,tValue*10);
facade->window->getPreview()->RebuildScene();
}

问题是:我这样做在逻辑上是正确的吗?

最佳答案

解决了部分(请阅读底部)将上\下移动与左\右分离:将上面的 mousemove 函数更改为

if (event->buttons() & Qt::RightButton) {
setMatrixes();


gluUnProject(event->x(), -event->y(), 0, model_matrix, proj_matrix, view_matrix, &newx, &newy, &newz);

float acc=sqrt((int)dx^2+(int)dy^2);
acc*=acc;


qDebug()<< acc;

if (dy<dx){
if (event->x()>lastPos.x()){
emit SignalPreviewMouseChanged((float)(newx/2500)*acc,0,(float)(-newz/2500)*acc);
}
else {
emit SignalPreviewMouseChanged((float)(-newx/2500)*acc,0,(float)(newz/2500)*acc);
}
}

else{
if (event->y()<lastPos.y())
emit SignalPreviewMouseChanged(0,(float)(newy/1750)*acc,0);
else {
emit SignalPreviewMouseChanged(0,(float)(-newy/1750)*acc,0);
}
}
isPressed=true;
}
lastPos = event->pos();
updateGL();

在 Controller 中时:

void Controller::SlotMouseTranslationValueChanged(float val1, float val2, float val3){

if (val1!=0) sceneRef->translate(val1,0,0);
if (val2!=0) sceneRef->translate(0,val2,0);
if (val3!=0) sceneRef->translate(0,0,val3);
facade->window->getPreview()->RebuildScene();
}

现在它没有延迟,一切正常。

考虑因素:

现在我不是拖动对象,而是使用 gluUnproject 检索我的对象可以移动的计划(然后调用将 add\sub 值添加到对象位置的翻译函数)。所以我的鼠标指向的位置不同从对象在我屏幕上的位置。

如何实现这个结果?谁能给我解释一下逻辑步骤?

关于c++ - 将 gluUnProject 用于在 3D 空间中移动的对象时滞后和缺乏准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17408501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com