![]() |
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]() ![]() ![]() |
|
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Доброе время суток.
Создаю 3-х мерную игру в жанре стратегии на основе OpenGL. Ну и как, наверное, во всех стратегиях в процессе самой игры снизу будет меню (что строить, мини-карта и так далее) и время-от-времени появляющееся справа меню. Так вот, так как расположения этих меню не будут зависеть от угла обзора в игре, нет смысла рисовать их в 3-х мерном пространстве, к тому же будет удобнее и быстрее, если ещё до преобразования 2-х мерных координат указателя мыши в 3-х мерные будет совершаться проверка на соответствие их (координат) координатам меню (клик по меню). Подскажите, пожалуйста, как в 3-х мерном пространстве нарисовать 2-х мерные объекты, которые будут абсолютно всегда располагаться "поверх" всех остальных объектов. Это сообщение отредактировал(а) KaraKum - 16.3.2008, 19:35 |
|||
|
||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: -1 Всего: 5 |
устанавливаеш ортогональную проэкцию рисуеш все что тебе надо в плоскости!
-------------------- Иногда переменная - это просто переменная |
|||
|
||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Вставил следующий код:
Но вообще никакой реакции, а ведь, как я понимаю, должен нарисоваться квадрат почти во весь экран. В чём проблема? |
|||
|
||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: -1 Всего: 5 |
Должно заработать! ![]() Это сообщение отредактировал(а) Graf_h - 17.3.2008, 15:44 -------------------- Иногда переменная - это просто переменная |
|||
|
||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Заработало! Только вот получается так, то нарисованное изображение также является 3-х мерным объектом и поэтому, если какие-то другие объекты окажутся ближе к наблюдателю, чем этот, то они будут прорисовываться поверх игрового меню. И к тому же здесь снова придётся преобразовывать координаты мыши, а нельзя просто сверить координаты мыши и меню по координатам 1024/768. Неужели нельзя установить опции так, чтобы в итоге можно было нарисовать абсолютно ближайший объект, которые никогда не перекроют другие и желательно с помощью координат 1024/768, чтобы можно было проверять координаты мыши сначала не нажал ли пользователь на меню, а только потом преобразовывать их в 3-х мерный мир?
Подскажите, пожалуйста, очень нужно. И ещё вопрос в довесок: можно ли и как в OpenGL определять цвет как смесь 3-х цветов от 0 до 255, а не между 0 и 1? Это сообщение отредактировал(а) KaraKum - 17.3.2008, 18:36 |
|||
|
||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: -1 Всего: 5 |
Можно! непомню точно, кажется glColor3ub(...) если честно то не вижу в этом никаких проблем! glRenderMode(GL_SELECT) и ничего не нужно переобразовывать! -------------------- Иногда переменная - это просто переменная |
|||
|
||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Функция цвета работает так как и хотелось
![]() А насчёт прорисовки: Код выглядит так:
Но вообще ничего не рисуется. Что я делаю не так? |
|||
|
||||
Graf_h |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: -1 Всего: 5 |
Не так!
![]()
Но и этого не достаточно... Нужно еще из чего то выбирать! В ОпенЖЛ это называется ьуфер выбора... тоесть ты его строиш сам. Более подробно можеш почитать об этом в учебниках ![]() вот пример:
Вот бегло пробежался по основным моментам! этот код можеш использовать но не знаю без ошибок ли он... советую почитать больше про выбор! надеюсь это поможет тебе ![]() Это сообщение отредактировал(а) Graf_h - 18.3.2008, 11:06 -------------------- Иногда переменная - это просто переменная |
||||
|
|||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Спасибо за такой развёрнутый ответ, но я видимо вопрос не так сформулировал.
Вобщем, я создаю игру в жанре 3-х мерной стратегии, в мире которой можно вращаться по всем осям и перемещаться во все стороны (хоть залезть в дуло танка). Так вот, а механизм взаимодействия мыши с объектами я в теории уже реализовал - это выглядит так: согласно такущему изменению глобальной оси от первоначальной (поворот и изменение угла обзора) при клике или движении мыши строится вектор с направлением, координаты которого можно сверять с объектами и принимать решение поразил ли вектор объект или нет и какой объект был поражён первым - на том и был произведён клик мыши. Но в игре должно быть меню, причём плоское и абсолютно всегда располагаться поверх всех остальных объектым вне зависимости от того как близко к ним находится наблюдатель. Так вот, если ли возможность каким-ниюбудь образом перейти в режим рисования таких объектов? P.S. Есть возможность рисовать с помощью GDI, но тогда я лешусь многих возможностей, которые предоставляет OpenGL. Это сообщение отредактировал(а) KaraKum - 18.3.2008, 12:50 |
|||
|
||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: -1 Всего: 5 |
Тоесть теб нужно обработать только меню?
-------------------- Иногда переменная - это просто переменная |
|||
|
||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Ну почти: поступившие в прогу координаты мыши (как интервалы между 1024 и 768) можно без проблем заставить обрабатывать объект "Меню" (меню не 3-х мерное и всегда на одном месте), после чего, если клик был не по меню, преобразовывать координаты в 3-х мерный мир и искать объект, на который пользователь предполагал нажать в зависимости от текущего вращения и glTranslated() глобальной матрицы.
Но главное, что нужно от меню, это невозможность его перекрытия, то есть, чтобы меню всегда было поверх всех остальных объектов, даже если, например, наблюдатель приблизился к какому-нибудь объекту по оси Z на расстояние -0.000000001 - вот так вот ![]() Это сообщение отредактировал(а) KaraKum - 18.3.2008, 12:43 |
|||
|
||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: -1 Всего: 5 |
Так ти же когда устанавливаеш проекции ты вказываеш отсечения по оси z! А когда ты рисуеш в ортогональной прекции то тогда у теба никогда трехмерный обьект не пересечет твое меню! -------------------- Иногда переменная - это просто переменная |
|||
|
||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Пробовал! Пересекается!
![]() В ортогональной проекции он рисуется в такой координате Z, которую указываешь при вызове функции glOrtho(), то есть так будто в 3D, только задаёшь рисунок с двухмерными координатами, а ось Z уже определена - по крайней мере у меня так было и если вращать область видимости (да, нарисованный квадрат (по ортогональной проекции) всегда находится в одном месте относительно наблюдателя) так, чтобы пол или другие объекты стали ближе, чем квадрат, то те объекты начинают прорисовываться поверх этого квадрата. ![]() Причём квадрат приходится рисовать не координатами в интервали 1024/768 (как задавал в функции glOrtho()) а также примерно от -2 до 2. |
|||
|
||||
Graf_h |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 482 Регистрация: 18.10.2007 Где: г. Ровно, Украина Репутация: -1 Всего: 5 |
В перспективной проекции ставиш отсечения например с 0.1 до например -200.0!
Когда рисуеш в ортогональной тогда пишеш glPushMatrix(); glLoadIdentity(); glTranslated(x,y,0.0f); DrawObject(); glPopMatrix(); и никогда у тебя ничего не пересечется -------------------- Иногда переменная - это просто переменная |
|||
|
||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Вставил этот код - вообще всё испортилось
![]() Можешь дать полный пример? ![]() |
|||
|
||||
![]() ![]() ![]() |
Вы можете найти полезным что... | |
|
|
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |