Модераторы: 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   Вверх
Graf_h
Дата 18.3.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include "stdafx.h"
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <gl/glaux.h>
#pragma comment(lib,"GLAUX.LIB")

HWND hw;
GLfloat ang=0;
GLfloat amb[]={1.0f,1.0f,1.0f,1.0f};
GLuint    texture[2];
GLfloat posz=-5.0f;
GLint st=1;
int resolutHEIGHT;
int resolutWIDTH;

GLfloat wWidth,wHeight;
/////////////////////////////////////////////////////////////////////////////
GLuint filter=0;                          // Èñïîëüçóåìûé ôèëüòð äëÿ òåêñòóð 
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // Õðàíèò òðè òèïà òóìàíà
GLuint fogfilter= 0;                    // Òèï èñïîëüçóåìîãî òóìàíà
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};
//////////////////////////////////////////////////////////////////////////////

GLvoid loadTexture(){
 
    AUX_RGBImageRec *texture1;
    texture1 = auxDIBImageLoad("pic/pic1.bmp");
    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,    GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
    
    texture1 = auxDIBImageLoad("pic/pic2.bmp");
    glGenTextures(1, &texture[1]);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,    GL_RGB, GL_UNSIGNED_BYTE, texture1->data);


}

void SetupRC(void){
glClearColor(0.5f,0.5f,0.5f,1.0f);
loadTexture();
glEnable(GL_TEXTURE_2D);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);

///////////fog///////////////
glEnable(GL_FOG);                       // Âêëþ÷àåò òóìàí (GL_FOG)
glFogi(GL_FOG_MODE, fogMode[2]);// Âûáèðàåì òèï òóìàíà
glFogfv(GL_FOG_COLOR, fogColor);        // Óñòàíàâëèâàåì öâåò òóìàíà
glFogf(GL_FOG_DENSITY, 0.35f);          // Íàñêîëüêî ãóñòûì áóäåò òóìàí
glHint(GL_FOG_HINT, GL_NICEST);      // Âñïîìîãàòåëüíàÿ óñòàíîâêà òóìàíà
glFogf(GL_FOG_START, 6.5f);             // Ãëóáèíà, ñ êîòîðîé íà÷èíàåòñÿ òóìàí
glFogf(GL_FOG_END, 9.5f);               // Ãëóáèíà, ãäå òóìàí çàêàí÷èâàåòñÿ.



}
void box(){
glBindTexture(GL_TEXTURE_2D, texture[1]);
 glBegin(GL_QUADS);

                // Ïåðåäíÿÿ ãðàíü
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Âåðõ ëåâî
    glEnd();

glBindTexture(GL_TEXTURE_2D, texture[1]);
     glBegin(GL_QUADS);
                // Çàäíÿÿ ãðàíü
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Íèç ëåâî
    glEnd();
glBindTexture(GL_TEXTURE_2D, texture[1]);
     glBegin(GL_QUADS);                // Âåðõíÿÿ ãðàíü
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Âåðõ ïðàâî
    
    glEnd();
    glBindTexture(GL_TEXTURE_2D, texture[1]);
     glBegin(GL_QUADS);// Íèæíÿÿ ãðàíü
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Íèç ïðàâî

                // Ïðàâàÿ ãðàíü
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Íèç ëåâî
glEnd();
    glBindTexture(GL_TEXTURE_2D, texture[1]);
     glBegin(GL_QUADS);// Íèæíÿÿ ãðàíü
                // Ëåâàÿ ãðàíü
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Âåðõ ëåâî

glEnd();
}


void drawBox(){

/////////////
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,GLfloat (resolutWIDTH)/GLfloat(resolutHEIGHT),0.01f,100.0f);
//MessageBox(hw,"ttt","ttt",0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPopMatrix();
     glPushMatrix();
     glTranslatef(0.0f,0.0f,posz);
    
     glRotatef(ang,1.0f,1.0f,1.0f);
     
     glColor3d(0.5, 0.5, 0.0);
    box();
    
glPopMatrix();
switch(st){
case 1:posz-=0.0035f;
        if (posz<-11.0f ){st=2;}
        ang+=0.5; break;
case 2:posz+=0.0035f;
        if (posz>0.0f ){st=1;}
        ang-=0.5; break;

    }    
//////////////////

}


void drawOrtho(){
GLfloat asp;
asp=resolutWIDTH/resolutHEIGHT;
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (resolutWIDTH<resolutHEIGHT){

glOrtho(-100.0f,100.0f,-100/asp,100/asp,1.0,-1.0);
} else glOrtho(-100.0*asp,100.0*asp,-100,100,1.0,-1.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPopMatrix();
static float x;
static float y;
static stx=1;
static sty=1;
glPushMatrix();

glColor3d(1, 1, 0);
glTranslatef(x,y,-1.0f);
glBegin(GL_QUADS);
    glVertex2i(10, 10);
    glVertex2i(100, 10);
    glVertex2i(100, 700);
    glVertex2i(10, 700);
glEnd();

glPopMatrix();
switch(stx){
case 1:x-=0.1;
if (x<-100.0f ){stx=2;}
break;

case 2:
x+=0.1;
if (x>100.0f ){stx=1;}
break;
};

switch(sty){
case 1:y-=0.5;
if (y<-100.0f ){sty=2;}
break;

case 2:
y+=0.5;
if (y>100.0f ){sty=1;}
break;
};

}

void RenderScene(void){
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     
     drawBox();
     drawOrtho();
glutSwapBuffers();
glutPostRedisplay();    
}

void changeSize(GLsizei w,GLsizei h){
resolutWIDTH=w ;
resolutHEIGHT = h;
    GLfloat asp;

    if (h==0) h=1;

glViewport(0,0,w,h);
asp= GLfloat (w)/GLfloat (h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,asp,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

void  main(void)
{
    HWND hdwind = GetDesktopWindow();
    HDC hdescDc = GetDC(hdwind);
    resolutWIDTH=GetDeviceCaps(hdescDc,HORZRES); 
    resolutHEIGHT = GetDeviceCaps(hdescDc,VERTRES);
    int xx= (resolutWIDTH/2)-400;
    int yy= (resolutHEIGHT/2)-300;

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |GLUT_DEPTH);
    glutInitWindowSize(800,600);
    glutInitWindowPosition(xx,yy);
    
    glutCreateWindow("VSL_Game studio");
    //glutFullScreen();
    glutReshapeFunc(changeSize);
    glutDisplayFunc(RenderScene);
    SetupRC();
    glutMainLoop();
    
}




Просто скопируй этот код! Работает как часы smile 


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


Опытный
**


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

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



(только щас заметил, что появилась вторая страница на теме  smile )
Скомпилировал... шикарно! Особенно туман. smile 

Нашёл проблему. Прежде я просто вызывал функцию glOrtho(), а надо:
Код

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1024, 768, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//ну и код рисования:
glColor3ub(255, 0, 0);
glBegin(GL_QUADS);
     glVertex2i(600, 10);
     glVertex2i(1000, 10);
     glVertex2i(1000, 300);
     glVertex2i(600, 300);
glEnd();

И теперь всё рисуется, и по координатам экрана - так будто в 2D.
Но снова проблема в том, что иногда этот нарисованный квадрат перекрывается другими объектами, если они располагаются к наблюдателю ближе, чем задано в функции glOrtho().

Вот .exe - файл. Перемащаться на стрелки и PageUp/PageDown, а вращаться на NUMPAD клавишами 8 и 2, 4 и 6, Insert и Delete.
Если подобраться к вращающемуся треугольнику или чайнику, то нарисованный через glOrtho() квадрат будет время от времени перекрываться.

P.S. Что означает "VSL_Game studio"?

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  WndProc_1.1.exe 56,00 Kb
PM MAIL WWW   Вверх
Graf_h
Дата 19.3.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



когда рисуеш в плоскости:
glTranslatef(x,y,-1.0f);
Я же тебе пример отправил! там никогда box не перекроет твой квадрат! box выходит за пределы области видимости но не перекрывает квадрат в плоскости! Внимательно посмотри! Будут вопросы обращайся  smile 


Цитата(KaraKum @  19.3.2008,  14:39 Найти цитируемый пост)
P.S. Что означает "VSL_Game studio"?

Это название нашей команды  smile 



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


Опытный
**


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

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



Работает! Как по заказу!  smile 

Цитата

Это название нашей команды

Гордо звучит. Вот бы так, чтобы на мировом рынке производителей игр фигурировали как главные конкуренты несколько русских компаний и "VSL_Game studio" в том числе  smile .

Вобщем, большое спасибо за помощь. Теперь все технические вопросы решены - осталось только программировать.

Вопрос помечен как решённый.
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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