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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отрисовать точки с известными координатами, Координаты в OpenGL 
:(
    Опции темы
Dementor
Дата 2.11.2013, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!

Я сразу извиняюсь за возможно глупые вопросы, но перекопав кучу уроков в сети я так и не нашел на них ответов (либо просто не понял).

Вопрос номер один - что вообще нужно сделать, чтобы нарисовать точку с координатами X=935929.50; Y=6638894.24; Z=850.55.

Вопрос номер два - есть ли какая-то литература (книги или уроки), в которой есть описание как нарисовать что-то мышкой (например полигон).

Буду очень признателен за любую помощь.

P.S. Для учебы я использую C++ Builder 6.
PM MAIL   Вверх
Bitter
Дата 2.11.2013, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 1
Всего: 27



Вы перекопали кучу уроков и не поняли как нарисовать примитив? Не верю. Скорее всего вы ничего не перкапывали, а посмотрели один два примера про куб и освещение и на этом все.

Как на счет
Код

 glPointSize(5.0f)
 glBegin(GL_POINTS)
 glVertext3f(935929.50f, 6638894.24f, 850.55f)
 glEnd();


Описание как нарисовать мышкой? Ну это кагбэ... берете мышку, берете форму или что там у вас, водите по форме мышкой и отлавливаете ее координаты, по которым рисуете линии. Вот вам и все описание. 

Это сообщение отредактировал(а) Bitter - 2.11.2013, 16:19
PM MAIL ICQ Skype   Вверх
Dementor
Дата 2.11.2013, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как именно грузить точки, линии, полигоны и все остальное я в курсе. Я не понимаю как настроить вид так, чтобы я видел эту точку.
Во всех уроках указывается, что необходимо прописывать настройки OpenGL в FormCreate и FormResize, ну и плюс настройка пикселей и высвобождение при закрытии формы.
У меня сейчас прописаны такие параметры:
Код

BOOL bSetupPixelFormat(HDC hdc)
{
  PIXELFORMATDESCRIPTOR pfd, *ppfd;
  int pixelformat;
 
  ppfd = &pfd;
 
  ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
  ppfd->nVersion = 1;
  ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  ppfd->dwLayerMask = PFD_MAIN_PLANE;
  ppfd->iPixelType = PFD_TYPE_RGBA;
  ppfd->cColorBits = 16;
  ppfd->cDepthBits = 16;
 
  ppfd->cAccumBits = 0;
  ppfd->cStencilBits = 0;
 
  if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
  {
    MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
    return FALSE;
  }
  if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
  {
    MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
    return FALSE;
  }
  return TRUE;
}

void __fastcall TForm6::FormCreate(TObject *Sender)
{
   ghDC = GetDC(Handle);
   if (!bSetupPixelFormat(ghDC)) Close();
   ghRC = wglCreateContext(ghDC);
   wglMakeCurrent(ghDC, ghRC);
   glClearColor(0.5, 0.5, 0.5, 0.0);
   FormResize(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm6::FormResize(TObject *Sender)
{
  glViewport(0, 0, ClientWidth, ClientWidth); //âûäåëÿåì îáëàñòü êóäà áóäåò âûâîäèòüñÿ íàø áóôåð
  glMatrixMode ( GL_PROJECTION ); //ïåðåõîäèì â ìàòðèöó ïðîåêöèè
  glLoadIdentity; //Ñáðàñûâàåì òåêóùóþ ìàòðèöó
  glFrustum ( -1 , 1, -1 , 1 , 1.25 , 100.0 ); //Îáëàñòü âèäèìîñòè
  glMatrixMode ( GL_MODELVIEW ); // ïåðåõîäèì â ìîäåëüíóþ ìàòðèöó
  glLoadIdentity; //Ñáðàñûâàåì òåêóùóþ ìàòðèöó
  gluLookAt(5,5,5,0,0,0,0,0,1); //ïîçèöèÿ íàáëþäàòåëÿ
  InvalidateRect ( Handle,NULL,False ); //ïåðåðèñîâêà ôîðìû
}
//---------------------------------------------------------------------------
void __fastcall TForm6::FormClose(TObject *Sender, TCloseAction &Action)
{
  if(ghRC)
  {
    wglMakeCurrent(ghDC,0);
    wglDeleteContext(ghRC);
  }
  if(ghDC)ReleaseDC(Handle, ghDC);
}

PM MAIL   Вверх
Bitter
Дата 2.11.2013, 19:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 1
Всего: 27



Вот у вас в формРесайзе написано 
glFrustum ( -1 , 1, -1 , 1 , 1.25 , 100.0 );
Если бы вы прошли по первой попавшейся ссылке в гугле по запросу "glFrustum", то увидели бы, что первый и второй параметры это координаты левой и правой отсекающей. Это значит что левая чать окна у вас будет соответствовать мировой координате по Х = -1, а правый край окна (а точнее вьюПорта, который вы указали методом glViewport) будет соответствовать мировой координате по Х = 1. То же самое касается верхней и нижней отсекающей. Последние два параметра это ближняя к "камере" и дальняя отсекающие. То есть все что вы пытаетесь рисовать ЗА этими координатами на экран не попадет.

Следующий фактор это позиция камеры, устанавливаемая функцией gluLookAt. Вбиваем в гугл и видим первые три параметра - eyeX, eyeY, eyeZ. то есть координаты камеры. Вы установили ее в 5 5 5. следующие три параметра это centerX, centerY, centerZ, то есть точка, в которую смотрит камера. 

Если вы рисуете точку в 935929.50, 6638894.24, 850.55, то вы ее не увидите, так как она выходит за границы вашей пирамиды видимости. Чтобы рисовать "как будто бы" на окне, нужно как минимум задать frustum равный размерам окна, после чего установить камеру на правильном расстоянии от нуля, и направить ее взгляд в 0, и не забыть про то что в таком случае вектор Up, который описывается тремя последними параметрами метода gluLookAt должен быть направлен вдоль оси Y, то есть быть 0, 1, 0, иначе у вас камера будет думать что у нее макушка на заднице.

Но и этого может быть не достаточно, не забывайте что еще несть настройки материала и освещения

Это сообщение отредактировал(а) Bitter - 2.11.2013, 19:54
PM MAIL ICQ Skype   Вверх
EgoBrain
Дата 5.11.2013, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

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



Bitter, можно подробнее о векторе Up, что он определяет. И почему 
Цитата(Bitter @  2.11.2013,  19:49 Найти цитируемый пост)
 иначе у вас камера будет думать что у нее макушка на заднице
 ?

PM MAIL ICQ Skype   Вверх
Bitter
Дата 5.11.2013, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 1
Всего: 27



EgoBrain, этот вектор указывает куда направлен верх камеры. Например когда вы делаете фотки фотоаппаратом, вы можете снимать в обычном горизонтальном режиме (в этом случае верх фотоаппарата направлен в небо) и в вертикальном режиме (в этом случае верх камеры направлен в сторону), точно так же и тут. 
user posted image
Если вектор Up будет указан не правильно, например указывать назад, то камера будет вести себя неадекватно, при перемещении камеры картинка может переворачиваться, крутиться и тд
PM MAIL ICQ Skype   Вверх
Pavia
Дата 5.11.2013, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(EgoBrain @  5.11.2013,  03:31 Найти цитируемый пост)
Bitter, можно подробнее о векторе Up, что он определяет. И почему Цитата(Bitter @  2.11.2013,  19:49 ) иначе у вас камера будет думать что у нее макушка на заднице ?

Богат и могуч русский язык. Автор хотел сказать что она будет смотреть не туда куда надо.

В 3D графике есть такое понятие как мировое пространство. Также известная как сцена. 
Так вот в этом мире располагаются все объекты  в том числе и камера.

Так вот задав координаты точки вы задали их в мировых координатах. 
Но у нас есть ещё и камера. У которой есть свои координаты.  Но помимо координат есть ещё и ориентация. Так вот если не направить, не нацелить камеру на точку, то мы её не увидим.  

Ориентация камеры задаётся системой координат. Т.е 3 векторами.
Представти что эти вектора типа карандашей жестко прикрепили к камере. И когда вы вращаете камеру эти вектора вращаются с ней.

Когда эти вектора крепили к камере один поставили сверху и направили вверх анг Up. Другой поставили прямо на окуляр (объектив) и направили в сторону глаз eye(один из вариантов в сторону съемки See).

3 вектор просто достроили до правой системы координат. Типо там где ручка у пленочной камеры. 

3 вектор можно почти всегда получить имея 2 других.

Замечания. Вектора UP и не EYE обязаны быть ортогональными. Математически gluLookAt приводит к ортогональным.  
Но для лучшего понимания, что куда направленно, при программировании их лучше сохранять ортогональными.

Это сообщение отредактировал(а) Pavia - 5.11.2013, 12:18
PM MAIL   Вверх
Dementor
Дата 5.11.2013, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Bitter, а вы не могли бы привести конкретные настройки для точек, которые находятся в пределах: 
MinX=938059.99 MaxX=940978.32 
MinY=6641968.24 MaxY=6646082.34 
MinZ=840.12 MaxZ=912.11.
PM MAIL   Вверх
Pavia
Дата 5.11.2013, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dementor,  Это проще сделать в любом 3D редакторе а после экспортировать параметры.

Кстати точность цифр выходит за Single. Зачем вам такие большая точность?

Это сообщение отредактировал(а) Pavia - 5.11.2013, 20:13
PM MAIL   Вверх
Dementor
Дата 5.11.2013, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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