У меня есть код для преобразований координат мыши в 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.