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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL:рисование 2x координатами в 3x пространстве 
V
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

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

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


 




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


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

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