Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод координат из экранных x;y в x;y;z OpenGL 
:(
    Опции темы
Coder
Дата 31.8.2007, 02:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



У меня есть программа, которая рисует псевдо 3D графику. Там используется экранная система координат x;y. Как перевести эти координаты в координаты OpenGL притом пропорционально разрешению экрана и удалению от сцены? 
Все данные у меня есть: x,y и высота объектов.
PM MAIL   Вверх
sgi1981
Дата 31.8.2007, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: нет
Всего: 10



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

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 перемещаем и поворачиваем камеру и перерисовываем сцену.
При этом автоматически будет меняться матрица проекции.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Coder
Дата 3.9.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



sgi1981, а как это будет на практике?

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

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

Присоединённый файл ( Кол-во скачиваний: 36 )
Присоединённый файл  untitled.JPG 9,57 Kb
PM MAIL   Вверх
sgi1981
Дата 6.9.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: нет
Всего: 10



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

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


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Reptor
Дата 3.10.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1213
Регистрация: 29.12.2004

Репутация: нет
Всего: 0



я тут увидел эту тему... что б не создавать новую то у меня таже проблема и я что то ничего не понимаю.. как это делать

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

т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);





PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0666 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.