OpenGL

Модератор: Модераторы разделов

Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

OpenGL

Сообщение 0xFF »

Как определить положение точки в пространстве относительно "глаза" после множественных трансформаций?...
Нужно выбрать мышкой объект. Пользуюсь freeglut-2.4.0'ом

Можно ли реализовать средствами OpenGL'я без сторонних библиотек?
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: OpenGL

Сообщение Alxn1 »

Насколько я помню, была такая функция, как gluUnProject. Она этим и занимается. Если не хочется пользоваться glu - можно расковырять исходники и просто эту функцию забабахать себе в проект.
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: OpenGL

Сообщение sdk »

Да. И почитай FAQ-и по OpenGL. В большинстве из них этот вопрос есть ;).
Например, на www.opengl.org.
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: OpenGL

Сообщение 0xFF »

Из FAQ:
How can I find the screen coordinates for a given object-space coordinate?
You can use the GLU library gluProject() utility routine if you only need to find it for a few vertices. For a large number of coordinates, it can be more efficient to use the Feedback mechanism.
To use gluProject(), you'll need to provide the ModelView matrix, projection matrix, viewport, and input object space coordinates. Screen space coordinates are returned for X, Y, and Z, with Z being normalized (0 <= Z <= 1).
How can I find the object-space coordinates for a pixel on the screen?
The GLU library provides the gluUnProject() function for this purpose.
You'll need to read the depth buffer to obtain the input screen coordinate Z value at the X,Y location of interest. This can be coded as follows:
GLdouble z;
glReadPixels (x, y, 1, 1, GL_DEPTH_COMPONENT, GL_DOUBLE, &z);
Note that x and y are OpenGL-centric with (0,0) in the lower-left corner.
You'll need to provide the screen space X, Y, and Z values as input to gluUnProject() with the ModelView matrix, Projection matrix, and viewport that were current at the time the specific pixel of interest was rendered.
------------------------------------------------------------------------------------------------------
Спасибо)
Спасибо сказали:
Аватара пользователя
Siros
Сообщения: 5
ОС: Ubuntu

Re: OpenGL

Сообщение Siros »

Просвятите нуба о библиотеках для создания графики?
Работаю в Code::Blocks IDE, сейчас курю мануалы по OpenGL, но по ходу чтения заметил чтое тсь разные навесные библиотеки для работы с OpenGL, если не в падлу сделайте крастенький обзорчик этих библитек, чтобы я знал какие маны курить... :blush:
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: OpenGL

Сообщение Shura »

да библиотек вроде не так много, да и при желании можно обойтись без них, так как они не расширяют возможности, а просто делают проще использование некоторых функций. Например glut, glew.
Rock'n'roll мертв © БГ
Спасибо сказали:
Аватара пользователя
Siros
Сообщения: 5
ОС: Ubuntu

Re: OpenGL

Сообщение Siros »

Разобрался я кое как в OpenGL, всё отлично, только есть некоторые вопросы. Я пишу небольшую игру (чисто для себя), змейку.
Представляю кусочек кода и вопрос:
Вопрос: Этот кусочек кода я честно украл )) так что помогите разобраться что тут и зачем делает, я как понял прокоментировал, но меня беспокоит, что для того чтобы дойти до usleep мну нужно нажать мышкой на окно или клавиатурой чёнить нажать, это совершенно неприемлемо для игры ))) которая долждна быть динамична, подскажите как мне получать альтернативно или более правильно нажатия с клавиатуры и мышки, без задержек ?
А точнее как организовтаь приём данных из буфера клавиатуры, например последнего символа (для того чтобы там не скапливалось куча нажатий)...

Код:

while (1) { XNextEvent(dpy, &event); switch (event.type) // Это насколько я понял список отправленных в окно нажатий { case KeyPress: // Это клавиатура, обрабатываеться только ESC как и зачем я чёт не понял, если можете расскажите как мне получать другие коды тут. { KeySym keysym; XKeyEvent *kevent; char buffer[1]; //It is necessary to convert the keycode to a keysym before checking if it is an escape kevent = (XKeyEvent *) &event; if ( (XLookupString((XKeyEvent *)&event,buffer,1,&keysym,NULL) == 1) && (keysym == (KeySym)XK_Escape) ) exit(0); break; } case ButtonPress: // Это мышка, тут я нажатиями клавишь управляю своей змейкой т.к. управлять клавой не понял как ))) switch (event.xbutton.button) { case 1: go -= 1; if(go<0)go=3; break; case 2: max++; if(max>99)exit(1); break; case 3: go += 1; if(go>3)go=0; break; } break; case ConfigureNotify: // чё за хвостик хз, не стал трогать... glViewport(0, 0, event.xconfigure.width, event.xconfigure.height); break; default: break; } usleep(200000); // Засыпаем (от времени будет зависеть скорость змейки) и дальше выполняеться алгоритм подсчёта новых координат змейки итд... ... }
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: OpenGL

Сообщение Uncle_Theodore »

Siros, тут сразу несколько вопросов...
Если ты пишешь на OpenGL, то зачем тебе вставка на чистом Xlib? Это очень низкоуровневая вещь, а у OpenGL (точнее. у glut'а) есть свои прекрасные функции обработки мышиных и клавиатурных событий.
Во-вторых, у Xlib'а есть неколько функций, которые обрабатывают очередь событий, некоторые из этих функций блокирующие как XNextEvent, а некоторые -- неблокирующие, как, например, XCheckWindowEvent, хотя там свои заморочки. Все они описаны в man XNetEvent, кстати...
Я в свое время много возился с этими вещами, даже простейший пример использования кода получается немалого размера и требует чуть ли не нескольких часов дебага. Чистый Xlib -- не очень приятная для программирования вещь.
Спасибо сказали:
Аватара пользователя
Siros
Сообщения: 5
ОС: Ubuntu

Re: OpenGL

Сообщение Siros »

Значит я не в те дебри залез, помогите обработать нажатия мышки и клавы другим способом?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: OpenGL

Сообщение v04bvs »

Siros писал(а):
18.07.2007 00:15
Вопрос: Этот кусочек кода я честно украл )) так что помогите разобраться что тут и зачем делает, я как понял прокоментировал, но меня беспокоит, что для того чтобы дойти до usleep мну нужно нажать мышкой на окно или клавиатурой чёнить нажать, это совершенно неприемлемо для игры

Надо использовать XPeekEvent (см. man)
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: OpenGL

Сообщение Uncle_Theodore »

Siros писал(а):
18.07.2007 15:00
Значит я не в те дебри залез, помогите обработать нажатия мышки и клавы другим способом?

Тут почитай
http://www.lighthouse3d.com/opengl/glut/index.php?9
Про клаву -- в меню слева.

Кстати, про XPeekEvent -- он не удаляет событие из очереди. То есть, один и тот же ивент будет пикаться много раз. И, кроме того, очередь будет расти, и через какое-то время работы программы, она станет очень тормозной.
Я обычно делаю if(XCheckWindowEvent(...)){...}, эта функция удаляет событие из очереди, но очередь все равно приходится время от времени флашать.
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: OpenGL

Сообщение Abaddon »

Siros писал(а):
18.07.2007 15:00
Значит я не в те дебри залез, помогите обработать нажатия мышки и клавы другим способом?

SDL поможет отцу русской демократии:). libSDL
портируемая и удобная. Простая инициализация OGL, обработка евентов от клавы, мыши, джойстика. Звук лучше через OpenAL отрабатывать, опять же портируемая, и базис такой-же, как в опенгл, соответственно очень удобно совмещать звуковое пространство с видео пространством...
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
Аватара пользователя
Siros
Сообщения: 5
ОС: Ubuntu

Re: OpenGL

Сообщение Siros »

Abaddon писал(а):
18.07.2007 19:12
SDL поможет отцу русской демократии:). libSDL
портируемая и удобная. Простая инициализация OGL, обработка евентов от клавы, мыши, джойстика.

Где бы мне вкурить маны по SDL? На русском... Желательно чтобы всё быстро и чётко понять...
:laugh: Заранее спасибо! :blush:

http://www.libsdl.org/intro.ru/toc.html Нашёл это, но всёже может кто поделиться своими источниками?

Немного о SDL: она работает паралельно с OpenGL или она её как использует?

Я хочу написать небольшую 3d игру на OpenGL, скажем с OpenGL я разберусь, какие ещё библиотеки попутно нужно бы знать? (SDL???)
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: OpenGL

Сообщение Abaddon »

Siros писал(а):
18.07.2007 19:24
Abaddon писал(а):
18.07.2007 19:12
SDL поможет отцу русской демократии:). libSDL
портируемая и удобная. Простая инициализация OGL, обработка евентов от клавы, мыши, джойстика.

Где бы мне вкурить маны по SDL? На русском... Желательно чтобы всё быстро и чётко понять...
:laugh: Заранее спасибо! :blush:

http://www.libsdl.org/intro.ru/toc.html Нашёл это, но всёже может кто поделиться своими источниками?

Немного о SDL: она работает паралельно с OpenGL или она её как использует?

Я хочу написать небольшую 3d игру на OpenGL, скажем с OpenGL я разберусь, какие ещё библиотеки попутно нужно бы знать? (SDL???)

По русски она где-то описана, но уже не помню где.
OpenGL она просто инициализирует, на этом ее работа прекращается (установить разрешение, проинициализировать окно opengl)
Дальше ее части используются для обработки ввода (перемещение мыши, нажатия на кнопки и тп)
Также, если посмотреть в раздел сопутствующих библиотек, можно найти работу с сетью и тп. Хотя сеть лучше реализовывать свою, при этом стоит поискать статьи выходившие в game development(design) gems, искать стоит в торентах и прочем, к сожалению на русский они не переводились и в Россию, насколько я понял не завозились, как следствие, придется скомуниздить:(
По русски про openal
Если хочется использовать движок... не знаю, для себя я так и не нашел ничего путнего... Но...
Для начала, этого хватит, если захочеся добавить физику, то ode, newton, и тп.

Мой совет, персональный, не замахиваться слишком высоко, начните с 3д тетриса, чтобы понять принцип работы с графикой, звуком и управлением, а потом уже с небольшим багажом двигайтесь дальше.
Сайт для набора багажа
и еще один
Направление движеия:)
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали: