我希望在OpenGL的屏幕上有一个对象跟随我的鼠标。 (我也在使用GLEW,GLFW和GLM)。我想出的最好的想法是:
使用glfwGetCursorPos获取窗口内的坐标。
窗口是用
创建的window = glfwCreateWindow( 1024, 768, "Test", NULL, NULL);
和获取坐标的代码是
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
接下来,我使用GLM unproject来获取“对象空间”中的坐标
glm::vec4 viewport = glm::vec4(0.0f, 0.0f, 1024.0f, 768.0f);
glm::vec3 pos = glm::vec3(xpos, ypos, 0.0f);
glm::vec3 un = glm::unProject(pos, View*Model, Projection, viewport);
我已经可以看到两个潜在的问题。视口很好,因为左下角的初始x,y坐标确实是0,0,它确实是1024 * 768窗口。但是,我创建的位置向量似乎并不正确。 Z坐标可能不应为零。然而,glfwGetCursorPos返回2D坐标,我不知道如何从那里到3D窗口坐标,特别是因为我不确定窗口坐标的第三维甚至意味着什么(因为计算机屏幕是2D)。然后,我不确定我是否正确使用unproject。假设视图,模型,投影矩阵都可以。如果我在Window坐标中传入了正确的位置向量,那么unproject调用是否给出了Object坐标中的坐标?我认为确实如此,但文档不清楚。
最后,对于我想要跟随鼠标的对象的每个顶点,我只是将x坐标递增为un [0],将y坐标递增为-un [1],将z坐标递增为un [2] 。但是,由于我的位置向量未被注册可能是错误的,这并没有给出好的结果;当鼠标移动时,物体会移动,但它会相当偏移(即移动鼠标不会使物体移动太多,z坐标非常大)。我实际上发现z坐标un [2]总是相同的值,无论我的鼠标在哪里,可能是因为我传入unproject的位置向量对于z总是具有0.0的值。但是,改变位置矢量中的最后一个坐标并不能解决物体比鼠标移动慢得多的事实。
答案 0 :(得分:0)
我认为你的主要问题实际上是z坐标。当您考虑屏幕上的某个点时,这不仅会指定对象空间中的点,而是指定直线。当您使用透明投影时,您可以从眼睛位置到任何对象空间点绘制一条线,并且这样一条线上的每个点都将投影到相同的屏幕空间点。
因此,当您使用z = 0取消项目时,您获得的实际上是近平面上的点。现在它将取决于您的物体远离相机的距离,如顶视图中所示。
你得到的是坐标相对于物体空间原点的点A.如果您只是从深度缓冲区中读取鼠标光标下像素的Z值,则可以返回B点。
但是,我认为A点或B点都没有真正帮助你。你需要一些进一步的约束。例如,您可以指定不改变对象的距离,并且鼠标指向的像素应该是对象中心(或对象空间中的任何其他参考点)应该出现的点。然后,您可以计算您必须将点移动到的光线上的点。但实际上你想要实施什么样的运动并不是很清楚。
作为旁注:手动调整顶点坐标不是一个好主意。 GPU可以做得更好。您应该只是操纵模型矩阵来移动对象。在这样的方案中,将点或光线投射到对象空间,而不是投射到世界空间中,并使用它来更新对象的模型矩阵将是有用的。