Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Перевод координат из экранных x;y в x;y;z OpenGL


Автор: Coder 31.8.2007, 02:25
У меня есть программа, которая рисует псевдо 3D графику. Там используется экранная система координат x;y. Как перевести эти координаты в координаты OpenGL притом пропорционально разрешению экрана и удалению от сцены? 
Все данные у меня есть: x,y и высота объектов.

Автор: sgi1981 31.8.2007, 20:12
Тебе писать код алгоритма перевода координат самому нет необходимости, хотя это и можно.
Но проще установить перспективную проекцию:

gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);
где:
fovy - угол обзора по направлению оси Y в градусах.
aspect - характеристическое отношение угла обзора по направлению оси X к углу обзора по направлению оси Y.
zNear, zFar - расстояние от наблюдателя до ближней и дальней плоскостей отсечения (занчения всегда положительны).

Код

//Меняется наблюдаемый объем и поле просмотра
//Вызывается при изменении размеров окна
void ChangeSize(GLsizei w, GLsizei h)
{
  GLfloat fAspect;
  //Предотвратить деление на нуль
  if (h == 0)
      h = 1;
  //Установить размеры поля просмотра на экране равными размерам окна просмотра
  glViewport(0, 0, w, h);
  fAspect = (GLfloat)w / (GLfloat)h;
  //Обновить систему координат
  glMatrixMode(GL_PROGECTION);
  glLoadIdentity();
  //Генерация перспективной проекции
  gluPerspective(60.0f, fAspect, 1.0, 400.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
};


Можно также изменить значения магических чисел значений расстояния от наблюдателя до ближней и дальней плоскостей отсечения.

Далее стандартными функциями OpenGL перемещаем и поворачиваем камеру и перерисовываем сцену.
При этом автоматически будет меняться матрица проекции.

Автор: Coder 3.9.2007, 09:52
sgi1981, а как это будет на практике?

Например, я рисую объект в псевдо 3D графике на экране с разрешением 1024x768. Если я масштабирую картинку, объект соответственно удаляется/приближается. Т.е. при изменении масштаба (x; y; "z") объекта пересчитываются. На плоскости вроде все просто. А здесь мне не ясно, как OpenGL координаты (0.0..1.0) связать с моими старыми координатами, которые зависели от разрешения экрана.

Смотрите прикрепленный файл.

Автор: sgi1981 6.9.2007, 13:42
Объясню еще раз.
Если ты до этого рисовал в ортографической проекции, то теперь в ней не рисуй, а рисуй в перспективной проекции. Как настроить камеру для перспективного проецирования я уже писал в этой теме.
Координаты задаешь те же, что и при рисовании в орто. Если были только две координаты, то третья координата может быть равна просто 0.
Действительные координаты вершин на экране аппаратура получает в для этапа :
1. Умножение координат тобой задаваемых на матрицу наблюдения модели - результат - координаты вершин в глобальной системе координат.
2. Умножение координат полученных от первого этапа на матрицу проецирования - результат - координаты вершин экранные.
Когда ты будешь изменять положение и ориентацию камеры в пространстве - будет меняться матрица проекции сцены. Матрицу наблюдения модели можешь загрузить единичную.
Координаты экранные будут зависеть таким образом от матрицы проецирования, которая изменяется при поворотах и смещении камеры.

Теперь понятно ?

Автор: Reptor 3.10.2008, 16:25
я тут увидел эту тему... что б не создавать новую то у меня таже проблема и я что то ничего не понимаю.. как это делать

У меня есть список вершин вот с такими координатами

т1(530, 606, 0);
т2(300, 606, 0);
т3(300, 546, 0);
т4(530, 546, 0);
т5(600, 531, 0);
т6(645, 576, 0);
т7(600, 621, 0);


вот и как мне вотету фигуру нарисовать в OpenGL.. ???

я использую 

Код

GLfloat Vertex[7][3];

Vertex[0][0]=530;
Vertex[0][1]=606;
Vertex[0][2]=0; // i tak dalee

.............

glVertexPointer(3, GL_FLOAT, 0, Vertex);
    glEnableClientState(GL_VERTEX_ARRAY);    
    glDrawArrays(GL_POLYGON, 0, 7);
    glDisableClientState(GL_VERTEX_ARRAY);





Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)