我对在OpenGL中放大当前鼠标位置的任务感到绝望。我尝试了很多不同的方法并阅读了其他帖子,但我无法将可能的解决方案适应于我的特定问题。因此,据我所理解的,您必须获取鼠标光标的当前窗口坐标,然后将其反投影以获取世界坐标,最后将其翻译为这些世界坐标。
为了找到当前的鼠标位置,我在我的GLUT鼠标回调函数中使用以下代码,每次右键单击时都会触发。
为了找到当前的鼠标位置,我在我的GLUT鼠标回调函数中使用以下代码,每次右键单击时都会触发。
if(button == 2)
{
mouse_current_x = x;
mouse_current_y = y;
...
接下来,在我的显示函数中,我会对当前鼠标位置进行反投影,然后设置模型视图和投影矩阵,这似乎也完美地工作:
// Unproject Window Coordinates
float mouse_current_z;
glReadPixels(mouse_current_x, mouse_current_y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &mouse_current_z);
glm::vec3 windowCoordinates = glm::vec3(mouse_current_x, mouse_current_y, mouse_current_z);
glm::vec4 viewport = glm::vec4(0.0f, 0.0f, (float)width, (float)height);
glm::vec3 worldCoordinates = glm::unProject(windowCoordinates, modelViewMatrix, projectionMatrix, viewport);
printf("(%f, %f, %f)\n", worldCoordinates.x, worldCoordinates.y, worldCoordinates.z);
现在开始翻译。目前,我正在绘制一个具有尺寸(dimensionX、dimensionY、dimensionZ)的立方体,并将其平移到该立方体的中心点,因此我的缩放也发生在中心点。我通过在z方向上进行平移(dolly)来实现缩放:
// Set ModelViewMatrix
modelViewMatrix = glm::mat4(1.0); // Start with the identity as the transformation matrix
modelViewMatrix = glm::translate(modelViewMatrix, glm::vec3(0.0, 0.0, -translate_z)); // Zoom in or out by translating in z-direction based on user input
modelViewMatrix = glm::rotate(modelViewMatrix, rotate_x, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the whole szene in x-direction based on user input
modelViewMatrix = glm::rotate(modelViewMatrix, rotate_y, glm::vec3(0.0f, 1.0f, 0.0f)); // Rotate the whole szene in y-direction based on user input
modelViewMatrix = glm::rotate(modelViewMatrix, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the camera by 90 degrees in negative x-direction to get a frontal look on the szene
modelViewMatrix = glm::translate(modelViewMatrix, glm::vec3(-dimensionX/2.0f, -dimensionY/2.0f, -dimensionZ/2.0f)); // Translate the origin to be the center of the cube
glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO);
glBufferSubData(GL_UNIFORM_BUFFER, sizeof(glm::mat4), sizeof(glm::mat4), glm::value_ptr(modelViewMatrix));
glBindBuffer(GL_UNIFORM_BUFFER, 0);
我试图通过将翻译转换为worldCoordinates向量来将其放置在立方体的中心,但这并没有起作用。我还尝试按宽度或高度缩放向量。 这里是否有一些重要的步骤我错过了?