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