OpenGL:鼠标移动对象,对象不能跟随鼠标

vdzxcuhz  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(208)

在用鼠标选中一个对象后,我希望能够用鼠标移动该对象。首先,我将鼠标位置转换为世界位置,并使用glReadPixels()将对象的深度读取为z:

double xpos, ypos, zpos;
glfwGetCursorPos(window_ptr, &xpos, &ypos);
float xPercent = (xpos + 0.5f) / scr_width_ * 2.0f - 1;  // range is -1 to +1
float yPercent = (ypos + 0.5f) / scr_height_ * 2.0f - 1;  // range is -1 to +1
yPercent = -yPercent;

glReadPixels(xpos, scr_height_ - ypos - 1, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zPercent);

然后我们移动鼠标直到我们想要释放鼠标。

last_position = (xPercent, yPercent, zPercent);

最后,我们使用与z值相同的值,并计算x的世界位置和y的位置:

current_position = (xPercent, yPercent, zPercent);

然后我们转换对象模型:

model = glm::translate(model, current_position - last_postion);

问题是:

  • 物体的速度与鼠标的速度不同。

等待你的回答。

tvokkenx

tvokkenx1#

问题是由屏幕和世界之间的坐标系差异引起的。您的光标位置是以“百分比”表示的(屏幕宽度的一部分),但对象可能放置在由投影矩阵确定的其他坐标系中(例如,除非您使用的是正交投影并且对象的世界空间坐标与屏幕空间坐标位于同一空间,你将得到不同运动。
例如,即使您有一个正交投影,它可能被配置为使屏幕Map到游戏世界的一个20米宽的区域,因此在范围[-1,1]内的任何地方移动鼠标(在屏幕的整个宽度上)将只转换为对象在屏幕的1/10上移动。
此外,您可能正在使用透视投影。在这种情况下,不仅您的世界坐标会与屏幕坐标不同,但实际上在屏幕坐标和世界坐标之间有一个非线性变换,这会导致对象的运动在屏幕边缘附近发生扭曲。您可以通过取消鼠标光标的屏幕投影来纠正这一点-使用glm::unproject将空间坐标转换回世界坐标。Here很好地解释了此过程。

相关问题