#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.
Комментариев нет:
Отправить комментарий