Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2012, 01:13   #1
АндрейRock
 
Регистрация: 04.05.2012
Сообщений: 3
Радость клик по объекту сцены OpenGL

У меня такой вопросик, пишу сцену на OpenGL и хотелось бы обрабатывать сообщения по клику на определенный объект. Их надо вроде в боксы описывать. но я не знаю как. Подскажите, пожалкйста. Или дайте сcылку хорошую на литературу.
АндрейRock вне форума Ответить с цитированием
Старый 04.05.2012, 20:43   #2
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Можно проще сделать.
Ты уже должен знать что есть буфер цвета(rgba), буфер глубины(z), и теперь ты можешь воспользоваться буфером шаблона(stencil) – читай это двумерный 255й-тный растр размером с видимую область, только используется он для шаблонных целей там дырки в объектах, зеркала... Мы можем его использовать и для других целей если нам не нужно делать дырки в объектах и зеркала и прочую пакость.

Коротко суть в том что при прорисовке каждого объекта у тебя данные пишутся в буфер цвета, буфер глубины если объектъ виденъ теперь же ты должен подключить буфер шаблона и записать в тех местах где виден объект некое особое число (сам выбирай в пределах 0-255 ты по нему будешь определять объект). После, когда у тебя вся сцена прорисовалась в буфере шаблона будет каша из этих значений от разных объектов, разумеется только видимых.
Следующим шагом тебе нужно прочитать из буфера шаблона по координатам курсора мыши значение. Это значение и подскажет на какой объект, ты попал мышкой.

Код:
Рисуем так...
void RenderWithStencilFill ( GLubyte StencilValueFill ) 
{
	// Включим тест шаблона
	glEnable(GL_STENCIL_TEST);
	// Тест шаблона всегда успешен
	glStencilFunc(GL_ALWAYS, StencilValueFill, 0);
	// Если буфер глубины прошел тест пишем наше значение в шаблон буфер, 
	// во всех остальных случаях оставим тек. значение.
	glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
	
	// Тут рисуется что угодно. Один объект или сборка, которые будут помечены одним числом 
	…

	glDisable(GL_STENCIL_TEST);
} 

// Читать так…
void Mouse (int button, int state, int x, int y)
{

 	g_mouse_x = x;
	g_mouse_y = y;
	
	// Буфер шаблона отражен по Y-оси относительно оконных координат. поэтом(WINDOW_HEIGHT - g_mouse_y)
	glReadPixels(g_mouse_x, WINDOW_HEIGHT - g_mouse_y, 1, 1, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &StencilValue);

	printf("on X=%d, Y=%d Stencil Buffer Value = %d\n", x, y, StencilValue );

	// StencilValue – идентификатор объекта!!!
}
Warn вне форума Ответить с цитированием
Старый 05.05.2012, 22:13   #3
АндрейRock
 
Регистрация: 04.05.2012
Сообщений: 3
Радость

спасибо )))) вот только я не совсем понял, как, именно, в данном случае работает glReadPixel? Как я понял, он возвращает данные из буфера цвета и в основном применяется для скриншотов......в вот если уже занесены в буффер трафарета пиксели, как их тогда определить?
АндрейRock вне форума Ответить с цитированием
Старый 05.05.2012, 22:15   #4
АндрейRock
 
Регистрация: 04.05.2012
Сообщений: 3
Радость

Наверно, еще что-нить надо после прочтения пикселя сделать.....
АндрейRock вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отрисовка динамической сцены Arigat0 Visual C++ 1 27.02.2012 20:42
Растягивание сцены в GLSceneViewer SalasAndriy Мультимедиа в Delphi 0 03.12.2010 20:29
Отрисовка сцены на форме Lawliet32 Общие вопросы C/C++ 0 12.10.2010 16:29
Музыканты демо-сцены VanHelsing Свободное общение 0 23.05.2010 00:23
OpenGL.Нормально отображение сцены (масштаб)? spamer Мультимедиа в Delphi 0 01.03.2010 01:25