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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL:рисование 2x координатами в 3x пространстве 
V
    Опции темы
KaraKum
  Дата 16.3.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброе время суток.
Создаю 3-х мерную игру в жанре стратегии на основе OpenGL. Ну и как, наверное, во всех стратегиях в процессе самой игры снизу будет меню (что строить, мини-карта и так далее) и время-от-времени появляющееся справа меню.
Так вот, так как расположения этих меню не будут зависеть от угла обзора в игре, нет смысла рисовать их в 3-х мерном пространстве, к тому же будет удобнее и быстрее, если ещё до преобразования 2-х мерных координат указателя мыши в 3-х мерные будет совершаться проверка на соответствие их (координат) координатам меню (клик по меню).
Подскажите, пожалуйста, как в 3-х мерном пространстве нарисовать 2-х мерные объекты, которые будут абсолютно всегда располагаться "поверх" всех остальных объектов.

Это сообщение отредактировал(а) KaraKum - 16.3.2008, 19:35
PM MAIL WWW   Вверх
Graf_h
Дата 17.3.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



устанавливаеш ортогональную проэкцию рисуеш все что тебе надо в плоскости!


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
KaraKum
  Дата 17.3.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вставил следующий код:
Код

glOrtho(0, 1024, 768, 0, 1, 1);
glColor3d(1, 0, 1);
glBegin(GL_QUADS);
    glVertex2i(10, 10);
    glVertex2i(1000, 10);
    glVertex2i(1000, 700);
    glVertex2i(10, 700);
glEnd();

Но вообще никакой реакции, а ведь, как я понимаю, должен нарисоваться квадрат почти во весь экран. В чём проблема?
PM MAIL WWW   Вверх
Graf_h
Дата 17.3.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Код

void ResizeWindow(GLsizei w,GLsizei h){
GLfloat asp;
if (h==0) h=1;
glViewport(0,0,w,h);
asp= GLfloat (w)/GLfloat (h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w>=h){
glOrtho(-100*asp, 100*asp, -100, 100, 1.0, -1.0);} else
glOrtho(-100, 100, -100/asp, 100/asp, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

Должно заработать!  smile 

Это сообщение отредактировал(а) Graf_h - 17.3.2008, 15:44


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
KaraKum
  Дата 17.3.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Заработало! Только вот получается так, то нарисованное изображение также является 3-х мерным объектом и поэтому, если какие-то другие объекты окажутся ближе к наблюдателю, чем этот, то они будут прорисовываться поверх игрового меню. И к тому же здесь снова придётся преобразовывать координаты мыши, а нельзя просто сверить координаты мыши и меню по координатам 1024/768. Неужели нельзя установить опции так, чтобы в итоге можно было нарисовать абсолютно ближайший объект, которые никогда не перекроют другие и желательно с помощью координат 1024/768, чтобы можно было проверять координаты мыши сначала не нажал ли пользователь на меню, а только потом преобразовывать их в 3-х мерный мир?
Подскажите, пожалуйста, очень нужно.

И ещё вопрос в довесок: можно ли и как в OpenGL определять цвет как смесь 3-х цветов от 0 до 255, а не между 0 и 1?

Это сообщение отредактировал(а) KaraKum - 17.3.2008, 18:36
PM MAIL WWW   Вверх
Graf_h
Дата 17.3.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Цитата(KaraKum @  17.3.2008,  18:08 Найти цитируемый пост)
И ещё вопрос в довесок: можно ли и как в OpenGL определять цвет как смесь 3-х цветов от 0 до 255, а не между 0 и 1?
 
Можно! непомню точно, кажется glColor3ub(...)




Цитата(KaraKum @  17.3.2008,  18:08 Найти цитируемый пост)
Заработало! Только вот получается так, то нарисованное изображение также является 3-х мерным объектом и поэтому, если какие-то другие объекты окажутся ближе к наблюдателю, чем этот, то они будут прорисовываться поверх игрового меню. И к тому же здесь снова придётся преобразовывать координаты мыши, а нельзя просто сверить координаты мыши и меню по координатам 1024/768. Неужели нельзя установить опции так, чтобы в итоге можно было нарисовать абсолютно ближайший объект, которые никогда не перекроют другие и желательно с помощью координат 1024/768, чтобы можно было проверять координаты мыши сначала не нажал ли пользователь на меню, а только потом преобразовывать их в 3-х мерный мир?Подскажите, пожалуйста, очень нужно.


если честно то не вижу в этом никаких проблем! glRenderMode(GL_SELECT) и ничего не нужно переобразовывать!



--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
KaraKum
  Дата 17.3.2008, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Функция цвета работает так как и хотелось  smile .
А насчёт прорисовки:
Код выглядит так:
Код

glRenderMode(GL_SELECT);
glLoadIdentity();
glBegin(GL_QUADS);
    glVertex2d(1, 1);
    glVertex2d(1000, 1);
    glVertex2d(1000, 700);
    glVertex2d(1, 700);
glEnd();

Но вообще ничего не рисуется. Что я делаю не так?
PM MAIL WWW   Вверх
Graf_h
Дата 18.3.2008, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Не так!  smile  OpenGL фактически работает в 3 режимах визуализации! По умолчанию стоит GL_RENDER! Если ты хочеш интерактивности, тогда включаеш режим glRenderMode(GL_SELECTION) но этого не достаточно...  далее обрабативаеш щелчок мышы:

Код

void Mousefunction(int button,int state,int x,int y){
if ((button==GLUT_LEFT_BUTTON)&&(state==GLUT_DOWN)){
        yourSelection(x,y);//твоя функция в которой ты будеш делать свой выбор
  }
}



Но и этого не достаточно... Нужно еще из чего то выбирать! В ОпенЖЛ это называется ьуфер выбора... тоесть ты его строиш сам. Более подробно можеш почитать об этом в учебниках smile 

вот пример:
Код

//тоесть в твоем буфере будет не более 10 обектов
#define BUFSIZE = 10

void yourSelection(int xpos,int ypos){ 
GLfloat asp;

static GLfloat yuorSelectBuffer[BUFSIZE];//еще лудше будет если использовать
                                                                 // vector<GLfloat >  yuorSelectBuffer  тогда не нужно заранее
                                                                //  указывать размер твоего буфера
GLint hits,view[4];

glSelectBuffer(BUFSIZE,yuorSelectBuffer);//настройка твоего буфера выбора

glGetIntegerv(GL_VIEWPORT,view);// здесь ты получаеш поле просмотра
glMatrixMode(GL_PROJECTION);
glPushMatrix();

glRenderMode(GL_SELECTION);
glLoadIdentity();
gluPickMatrix(xpos,view[3]-ypos,2,2,view);
asp=static_cast<float> view[2]/static_cast<float> view[3];
gluPerspective(45.0f,asp,1.0,100.0);
RenderScene();//здесь твоя  функция  рисования сцены

hits = glRenderMode(GL_RENDER);//проверяеш на совпадения

if (hits==1){
yourFunction(yuorSelectBuffer[3]);
}

glMatrixMode(GL_PROGECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}

void RenderScene(){
...
glInitNames();//инициализвция стека имен
glPushName(0);

// наппример рисуем сферу

glPushMatrix();

glLoadName(sphere);
drawYourSphere(10);// здесь ты можеш рисовать что угодно
glPopMatrix();

}

// здесь ты анализируеш твой буфер
void yourFunction( GLuint *selBuff){
   int id,count;

  count=selBuff[0];
  id =selBuf[3];
  
  switch(id){
    case sphere: // что то делаем
    break;
}
 
}


Вот бегло пробежался по основным моментам! этот код можеш использовать но не знаю без ошибок ли он... советую почитать больше про выбор! надеюсь это поможет тебе smile 


Это сообщение отредактировал(а) Graf_h - 18.3.2008, 11:06


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
KaraKum
  Дата 18.3.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за такой развёрнутый ответ, но я видимо вопрос не так сформулировал.
Вобщем, я создаю игру в жанре 3-х мерной стратегии, в мире которой можно вращаться по всем осям и перемещаться во все стороны (хоть залезть в дуло танка). Так вот, а механизм взаимодействия мыши с объектами я в теории уже реализовал - это выглядит так: согласно такущему изменению глобальной оси от первоначальной (поворот и изменение угла обзора) при клике или движении мыши строится вектор с направлением, координаты которого можно сверять с объектами и принимать решение поразил ли вектор объект или нет и какой объект был поражён первым - на том и был произведён клик мыши.
Но в игре должно быть меню, причём плоское и абсолютно всегда располагаться поверх всех остальных объектым вне зависимости от того как близко к ним находится наблюдатель. Так вот, если ли возможность каким-ниюбудь образом перейти в режим рисования таких объектов?

P.S. Есть возможность рисовать с помощью GDI, но тогда я лешусь многих возможностей, которые предоставляет OpenGL.

Это сообщение отредактировал(а) KaraKum - 18.3.2008, 12:50
PM MAIL WWW   Вверх
Graf_h
Дата 18.3.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Тоесть теб нужно обработать только меню?


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
KaraKum
  Дата 18.3.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну почти: поступившие в прогу координаты мыши (как интервалы между 1024 и 768) можно без проблем заставить обрабатывать объект "Меню" (меню не 3-х мерное и всегда на одном месте), после чего, если клик был не по меню, преобразовывать координаты в 3-х мерный мир и искать объект, на который пользователь предполагал нажать в зависимости от текущего вращения и glTranslated() глобальной матрицы.
Но главное, что нужно от меню, это невозможность его перекрытия, то есть, чтобы меню всегда было поверх всех остальных объектов, даже если, например, наблюдатель приблизился к какому-нибудь объекту по оси Z на расстояние -0.000000001 - вот так вот  smile .

Это сообщение отредактировал(а) KaraKum - 18.3.2008, 12:43
PM MAIL WWW   Вверх
Graf_h
Дата 18.3.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



Цитата(KaraKum @  18.3.2008,  12:42 Найти цитируемый пост)
наблюдатель приблизился к какому-нибудь объекту по оси Z на расстояние -0.000000001 - вот так вот

 
Так ти же когда устанавливаеш проекции ты вказываеш отсечения по оси z! А когда ты рисуеш в ортогональной прекции то тогда у теба никогда трехмерный обьект не пересечет твое меню! 


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
KaraKum
  Дата 18.3.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пробовал! Пересекается!  smile 
В ортогональной проекции он рисуется в такой координате Z, которую указываешь при вызове функции glOrtho(), то есть так будто в 3D, только задаёшь рисунок с двухмерными координатами, а ось Z уже определена - по крайней мере у меня так было и если вращать область видимости (да, нарисованный квадрат (по ортогональной проекции) всегда находится в одном месте относительно наблюдателя) так, чтобы пол или другие объекты стали ближе, чем квадрат, то те объекты начинают прорисовываться поверх этого квадрата. smile 
Причём квадрат приходится рисовать не координатами в интервали 1024/768 (как задавал в функции glOrtho()) а также примерно от -2 до 2.
PM MAIL WWW   Вверх
Graf_h
Дата 18.3.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

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



В перспективной проекции ставиш отсечения например с 0.1 до например -200.0! 
Когда рисуеш в ортогональной тогда пишеш 
glPushMatrix();
glLoadIdentity();
glTranslated(x,y,0.0f);
DrawObject();
glPopMatrix();

и никогда у тебя ничего не пересечется


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
KaraKum
Дата 18.3.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вставил этот код - вообще всё испортилось  smile .
Можешь дать полный пример? smile 
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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