OpenGl получает положение мыши

У меня есть функция для создания вектора с координатами мыши в трехмерном пространстве.

Вот мой код:

void myMouse(int x, int y){
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;

glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );

winX = (float)x;
winY = (float)viewport[3] - (float)y;  // Subtract The Current Mouse Y Coordinate

glReadPixels( x, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );//Reads the depth buffergluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);vector.x=posX;
vector.y=posY;
vector.z=posZ;
}

Затем вектор используется в качестве аттрактора для некоторых точек, которые я рисую. Код работает очень хорошо, если я устанавливаю позицию z в ​​0, но тогда точки не следуют за курсором мыши, когда я поворачиваю сцену. Но если я установлю vector.z как приведенный выше код, частицы начнут двигаться ко мне, а затем они исчезнут (то есть они уйдут за точку обзора).

Я бы хотел, чтобы мои точки следовали за мышью только по оси x / y, когда ось z направлена ​​на меня, на оси x / z, когда ось y направлена ​​на меня, и на ось y / z, когда x ось направлена ​​на меня.

В качестве альтернативы, как я могу установить положение z на фиксированном расстоянии от моей точки зрения?

1

Решение

Скорее всего, ваша проблема заключается в следующих строках:

glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );

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

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

0

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

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

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