Страницы

Поиск по вопросам

вторник, 19 марта 2019 г.

OpenGL - “Поймать Мышь”

У меня есть код для преобразований координат мыши в OpenGL координаты. И вроде отрисовывается и всё прекрасно, но при подведении мыши к краю, центр квадрата (это полигон по координатам мыши) смещается в сторону.
Кто сталкивался с проблемой или у кого есть рабочий код по отлову координат в OpenGL?
ТОЛЬКО НЕ GLUT!
Этого дела полно в Сети. Пишу не под ним.
Ссылка на исходники
~Координаты мыши
GLvoid MouseCord(int mouse_x, int mouse_y, CVector3& p1) { // mouse_x, mouse_y - оконные координаты курсора мыши. // p1, p2 - возвращаемые параметры - концы селектирующего отрезка, // лежащие соответственно на ближней и дальней плоскостях // отсечения. GLint viewport[4]; // параметры viewport-a. GLdouble projection[16]; // матрица проекции. GLdouble modelview[16]; // видовая матрица. GLdouble vx,vy,vz; // координаты курсора мыши в системе координат viewport-a. GLdouble wx,wy,wz; // возвращаемые мировые координаты.
glGetIntegerv(GL_VIEWPORT,viewport); // узнаём параметры viewport-a. glGetDoublev(GL_PROJECTION_MATRIX,projection); // узнаём матрицу проекции. glGetDoublev(GL_MODELVIEW_MATRIX,modelview); // узнаём видовую матрицу. // переводим оконные координаты курсора в систему координат viewport-a. vx = mouse_x; vy = viewport[3] - mouse_y - 1; // вычисляем ближний конец селектирующего отрезка. vz = -1; gluUnProject(vx, vy, vz, modelview, projection, viewport, &wx, &wy, &wz); p1.x = wx*100; p1.y = wy*100; p1.z = wz; system("cls"); std::cout<<"p1.x: "<p1.y: "<p1.z: "<~Отрисовка примитивов и задника
GLvoid DrawGLScene(CVector3 p1) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Очистка экрана и буфера глубины glBindTexture(GL_TEXTURE_2D, texture[2]); glLoadIdentity(); // glTranslatef(0.0f,0.0f,-7.0f); // Сдвинуть вправо и вглубь экрана glBegin(GL_QUADS); // Рисуем куб // Передняя грань glNormal3f( 0.0f, 0.0f, 1.0f); // Нормаль указывает на наблюдателя glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Точка 1 (Перед) glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Точка 2 (Перед) glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Точка 3 (Перед) glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Точка 4 (Перед)
glEnd(); // Закончили квадраты
if(Btexture) { glBindTexture(GL_TEXTURE_2D, texture[0]); } else { glBindTexture(GL_TEXTURE_2D, texture[1]); }
glLoadIdentity(); glTranslatef(0.0f,0.0f,-7.0f); // Сдвинуть вправо и вглубь экрана glRotatef(rquad,0.0f,0.0f,1.0f); // Вращение куба по X, Y & Z glBegin(GL_QUADS); // Рисуем куб // Передняя грань glNormal3f( 0.0f, 0.0f, 1.0f); // Нормаль указывает на наблюдателя glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f+p1.x, -1.0f+p1.y, 1.0f); // Точка 1 (Перед) glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f+p1.x, -1.0f+p1.y, 1.0f); // Точка 2 (Перед) glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f+p1.x, 1.0f+p1.y, 1.0f); // Точка 3 (Перед) glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f+p1.x, 1.0f+p1.y, 1.0f); // Точка 4 (Перед)
glEnd(); // Закончили квадраты };
~Меняем размер окна применяем параметры
GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height) { if (Height==0) // Предотвращение деления на ноль, если окно слишком мало Height=1;
glViewport(0, 0, Width, Height); // Сброс текущей области вывода и перспективных преобразований
glMatrixMode(GL_PROJECTION);// Выбор матрицы проекций glLoadIdentity(); // Сброс матрицы проекции
gluPerspective(65.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Вычисление соотношения геометрических размеров для окна glMatrixMode(GL_MODELVIEW); // Выбор матрицы просмотра модели
};


Ответ

К сожалению ваши исходники не доступны. Лучше бы добавили скриншоты проблемы. Вы можете попробовать ортогональную проекцию, может ли она.
Если преобразовывать координаты мыши в 3Д координаты ОпенГЛ, то вы должны получить луч, а не точку, т.к. при разном значении vz координат мыши, вы получите разные координаты z в 3D. Тут есть 2 варианта решения:
Вы переводите 2 точки координат мыши с разными vz и получив луч в 3Д пространстве, найти точку пересечения его с интересующей вас плоскостью. Это ваша конечная точка. Найти какое должно быть значение vz для конкретной точки в 3Д пространстве. Если ваша плоскость находится "лицом" к камере, то берёте любую точку на ней и проецируете её на экран. Затем берёте знамение Z этой точки спроецированной на экран и используете её как значение для vz.

Комментариев нет:

Отправить комментарий