| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > OpenGL:рисование 2x координатами в 3x пространстве |
| Автор: KaraKum 16.3.2008, 12:17 |
| Доброе время суток. Создаю 3-х мерную игру в жанре стратегии на основе OpenGL. Ну и как, наверное, во всех стратегиях в процессе самой игры снизу будет меню (что строить, мини-карта и так далее) и время-от-времени появляющееся справа меню. Так вот, так как расположения этих меню не будут зависеть от угла обзора в игре, нет смысла рисовать их в 3-х мерном пространстве, к тому же будет удобнее и быстрее, если ещё до преобразования 2-х мерных координат указателя мыши в 3-х мерные будет совершаться проверка на соответствие их (координат) координатам меню (клик по меню). Подскажите, пожалуйста, как в 3-х мерном пространстве нарисовать 2-х мерные объекты, которые будут абсолютно всегда располагаться "поверх" всех остальных объектов. |
| Автор: Graf_h 17.3.2008, 10:33 |
| устанавливаеш ортогональную проэкцию рисуеш все что тебе надо в плоскости! |
| Автор: KaraKum 17.3.2008, 12:03 | ||
Вставил следующий код:
Но вообще никакой реакции, а ведь, как я понимаю, должен нарисоваться квадрат почти во весь экран. В чём проблема? |
| Автор: Graf_h 17.3.2008, 15:41 | ||
Должно заработать! |
| Автор: KaraKum 17.3.2008, 18:08 |
| Заработало! Только вот получается так, то нарисованное изображение также является 3-х мерным объектом и поэтому, если какие-то другие объекты окажутся ближе к наблюдателю, чем этот, то они будут прорисовываться поверх игрового меню. И к тому же здесь снова придётся преобразовывать координаты мыши, а нельзя просто сверить координаты мыши и меню по координатам 1024/768. Неужели нельзя установить опции так, чтобы в итоге можно было нарисовать абсолютно ближайший объект, которые никогда не перекроют другие и желательно с помощью координат 1024/768, чтобы можно было проверять координаты мыши сначала не нажал ли пользователь на меню, а только потом преобразовывать их в 3-х мерный мир? Подскажите, пожалуйста, очень нужно. И ещё вопрос в довесок: можно ли и как в OpenGL определять цвет как смесь 3-х цветов от 0 до 255, а не между 0 и 1? |
| Автор: KaraKum 17.3.2008, 21:11 | ||
| Функция цвета работает так как и хотелось А насчёт прорисовки: Код выглядит так:
Но вообще ничего не рисуется. Что я делаю не так? |
| Автор: Graf_h 18.3.2008, 11:04 | ||||
Не так!
Но и этого не достаточно... Нужно еще из чего то выбирать! В ОпенЖЛ это называется ьуфер выбора... тоесть ты его строиш сам. Более подробно можеш почитать об этом в учебниках вот пример:
Вот бегло пробежался по основным моментам! этот код можеш использовать но не знаю без ошибок ли он... советую почитать больше про выбор! надеюсь это поможет тебе |
| Автор: KaraKum 18.3.2008, 12:22 |
| Спасибо за такой развёрнутый ответ, но я видимо вопрос не так сформулировал. Вобщем, я создаю игру в жанре 3-х мерной стратегии, в мире которой можно вращаться по всем осям и перемещаться во все стороны (хоть залезть в дуло танка). Так вот, а механизм взаимодействия мыши с объектами я в теории уже реализовал - это выглядит так: согласно такущему изменению глобальной оси от первоначальной (поворот и изменение угла обзора) при клике или движении мыши строится вектор с направлением, координаты которого можно сверять с объектами и принимать решение поразил ли вектор объект или нет и какой объект был поражён первым - на том и был произведён клик мыши. Но в игре должно быть меню, причём плоское и абсолютно всегда располагаться поверх всех остальных объектым вне зависимости от того как близко к ним находится наблюдатель. Так вот, если ли возможность каким-ниюбудь образом перейти в режим рисования таких объектов? P.S. Есть возможность рисовать с помощью GDI, но тогда я лешусь многих возможностей, которые предоставляет OpenGL. |
| Автор: Graf_h 18.3.2008, 12:31 |
| Тоесть теб нужно обработать только меню? |
| Автор: KaraKum 18.3.2008, 12:42 |
| Ну почти: поступившие в прогу координаты мыши (как интервалы между 1024 и 768) можно без проблем заставить обрабатывать объект "Меню" (меню не 3-х мерное и всегда на одном месте), после чего, если клик был не по меню, преобразовывать координаты в 3-х мерный мир и искать объект, на который пользователь предполагал нажать в зависимости от текущего вращения и glTranslated() глобальной матрицы. Но главное, что нужно от меню, это невозможность его перекрытия, то есть, чтобы меню всегда было поверх всех остальных объектов, даже если, например, наблюдатель приблизился к какому-нибудь объекту по оси Z на расстояние -0.000000001 - вот так вот |
| Автор: Graf_h 18.3.2008, 12:58 | ||
Так ти же когда устанавливаеш проекции ты вказываеш отсечения по оси z! А когда ты рисуеш в ортогональной прекции то тогда у теба никогда трехмерный обьект не пересечет твое меню! |
| Автор: KaraKum 18.3.2008, 13:21 |
| Пробовал! Пересекается! В ортогональной проекции он рисуется в такой координате Z, которую указываешь при вызове функции glOrtho(), то есть так будто в 3D, только задаёшь рисунок с двухмерными координатами, а ось Z уже определена - по крайней мере у меня так было и если вращать область видимости (да, нарисованный квадрат (по ортогональной проекции) всегда находится в одном месте относительно наблюдателя) так, чтобы пол или другие объекты стали ближе, чем квадрат, то те объекты начинают прорисовываться поверх этого квадрата. Причём квадрат приходится рисовать не координатами в интервали 1024/768 (как задавал в функции glOrtho()) а также примерно от -2 до 2. |
| Автор: Graf_h 18.3.2008, 13:40 |
| В перспективной проекции ставиш отсечения например с 0.1 до например -200.0! Когда рисуеш в ортогональной тогда пишеш glPushMatrix(); glLoadIdentity(); glTranslated(x,y,0.0f); DrawObject(); glPopMatrix(); и никогда у тебя ничего не пересечется |
| Автор: KaraKum 18.3.2008, 14:11 |
| Вставил этот код - вообще всё испортилось Можешь дать полный пример? |
| Автор: Graf_h 18.3.2008, 16:20 | ||
Просто скопируй этот код! Работает как часы |
| Автор: KaraKum 19.3.2008, 14:39 | ||
| (только щас заметил, что появилась вторая страница на теме Скомпилировал... шикарно! Особенно туман. Нашёл проблему. Прежде я просто вызывал функцию glOrtho(), а надо:
И теперь всё рисуется, и по координатам экрана - так будто в 2D. Но снова проблема в том, что иногда этот нарисованный квадрат перекрывается другими объектами, если они располагаются к наблюдателю ближе, чем задано в функции glOrtho(). Вот .exe - файл. Перемащаться на стрелки и PageUp/PageDown, а вращаться на NUMPAD клавишами 8 и 2, 4 и 6, Insert и Delete. Если подобраться к вращающемуся треугольнику или чайнику, то нарисованный через glOrtho() квадрат будет время от времени перекрываться. P.S. Что означает "VSL_Game studio"? |
| Автор: Graf_h 19.3.2008, 15:59 |
| когда рисуеш в плоскости: glTranslatef(x,y,-1.0f); Я же тебе пример отправил! там никогда box не перекроет твой квадрат! box выходит за пределы области видимости но не перекрывает квадрат в плоскости! Внимательно посмотри! Будут вопросы обращайся Это название нашей команды |
| Автор: KaraKum 20.3.2008, 09:50 | ||
Работает! Как по заказу!
Гордо звучит. Вот бы так, чтобы на мировом рынке производителей игр фигурировали как главные конкуренты несколько русских компаний и "VSL_Game studio" в том числе Вобщем, большое спасибо за помощь. Теперь все технические вопросы решены - осталось только программировать. Вопрос помечен как решённый. |