Увеличьте текущую позицию мыши в OpenGL, используя функциональность GLM

Я в отчаянии от задачи увеличить текущую позицию мыши в OpenGL. Я пробовал много разных вещей и читал другие посты на эту тему, но я не мог адаптировать возможные решения для моей конкретной проблемы. Итак, насколько я понял, вам нужно получить текущие координаты окна курсора мыши, затем отменить проецирование их, чтобы получить мировые координаты и, наконец, перевести на эти мировые координаты.

Чтобы найти текущее положение мыши, я использую следующий код в функции обратного вызова мыши GLUT каждый раз, когда нажимается правая кнопка мыши.

if(button == 2)
{
mouse_current_x = x;
mouse_current_y = y;
...

Затем, я настраиваю текущие позиции мыши в моей функции отображения перед настройкой матриц ModelView и Projection, которые также, кажется, работают отлично:

// 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-направлении (тележка):

// 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, но это не сработало. Я также пытался масштабировать вектор по ширине или высоте.
Я пропускаю какой-то важный шаг здесь?

3

Решение

Может быть, это не сработает в вашем случае. Но мне кажется, что это лучший способ справиться с этим. Используйте glulookat (), чтобы посмотреть положение xyz щелчка мыши, которое вы уже нашли. Затем измените функцию gluPerspective () на меньший угол обзора, чтобы добиться фактического увеличения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]