Страницы

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

воскресенье, 26 января 2020 г.

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

#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.

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

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