Ogl v1.0

Soyez le premier à donner votre avis sur cette source.

Vue 5 521 fois - Téléchargée 369 fois

Description

Ce programme permet d'approfondir vos connaissances sur OpenGL.

logiciel : Borland C++ Bulder V5

Source / Exemple :


//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "openGL.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
int ray=4; int hh0=0; int hh1=0; int ll=15; int tt=15;  int XX=0; int YY=0;
int X0=0;  int Y0=0;  int ZZ=0;  int Z0=0;  int BMP;     int BMP_MAX=6;
int hau;
int tmp=1;     int g0;   int g=0;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
    hdc = GetDC(Handle);

    PIXELFORMATDESCRIPTOR pfd = {
    sizeof(PIXELFORMATDESCRIPTOR),
    1,PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    PFD_TYPE_RGBA,24,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,PFD_MAIN_PLANE,0,0,0,};
    PixelFormat = ChoosePixelFormat(hdc, &pfd);
    SetPixelFormat(hdc, PixelFormat, &pfd);

    hrc = wglCreateContext(hdc);

    if(wglMakeCurrent(hdc, hrc) == false)

    w = ClientWidth;
    h = ClientHeight;

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    //           red   green blue  alpha
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    SetupTextures();

    GLfloat MaterialAmbient[]      = {0.5, 0.5, 0.5, 1.0};
    GLfloat MaterialDiffuse[]      = {1.0, 1.0, 1.0, 1.0};
    GLfloat MaterialSpecular[]     = {1.0, 1.0, 1.0, 1.0};
    GLfloat MaterialShininess[]    = {50.0};
    GLfloat AmbientLightPosition[] = {0.5, 1.0, 1.0, 0.0};
    GLfloat LightAmbient[]         = {0.5, 0.5, 0.5, 1.0};

    glMaterialfv(GL_FRONT,  GL_AMBIENT,   MaterialAmbient);
    glMaterialfv(GL_FRONT,  GL_DIFFUSE,   MaterialDiffuse);
    glMaterialfv(GL_FRONT,  GL_SPECULAR,  MaterialSpecular);
    glMaterialfv(GL_FRONT,  GL_SHININESS, MaterialShininess);
    glLightfv(   GL_LIGHT0, GL_POSITION,  AmbientLightPosition);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, LightAmbient);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glShadeModel(GL_SMOOTH);

    startoflist = glGenLists(4);

    }
//---------------------------------------------------------------------------
void __fastcall TForm2::FormResize(TObject *Sender)
{
    GLfloat nRange = 80;
    w = ClientWidth;
    h = ClientHeight;

    if(h == 0)  h = 1;

    //        x, y, width, height
    glViewport(0, 0, w    , h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    if (w <= h)
    glOrtho (-nRange*2,nRange*2,-nRange*h*2/w,nRange*h*2/w,-nRange*2,nRange*2);
    else
    glOrtho (-nRange*w*2/h,nRange*w*2/h,-nRange*2,nRange*2,-nRange*2,nRange*2);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    }
//---------------------------------------------------------------------------
void __fastcall TForm2::DrawObjects()
{
for (int i=1;i<BMP_MAX;i++)
    {if (BMP==i)  glBindTexture(GL_TEXTURE_2D, texture[i]); }

    glPushMatrix();
     // glColor3f(0.8f, 0.8f, 0.8f);
     glTranslatef(XX, YY, ZZ);
    // glTranslatef(0.0f, 15.0f, 20.0f);
    glRotatef(90, 1.0, 00.0, 0.0);
    glCallList(startoflist);
    glPopMatrix();

    //Top
    glPushMatrix();
    //  glColor3f(0.8f, 0.8f, 0.8f);
    glDisable(GL_CULL_FACE);
    glTranslatef(XX, YY, ZZ);
    // glTranslatef(0.0f, 15.0f, 20.0f);
    glRotatef(-90, 1.0, 0.0, 0.0);
    glCallList(startoflist + 1);
    // glEnable(GL_CULL_FACE);
    glPopMatrix();

    //Bottom
    glPushMatrix();
    //  glColor3f(0.8f, 0.8f, 0.8f);
    glTranslatef(XX, -hau+YY, ZZ);
    //  glTranslatef(0.0f, -10.0f, 20.0f);
    glRotatef(90, 1.0, 0.0, 0.0);
    glCallList(startoflist + 2);
    glPopMatrix();

      ///////////////////////////////////
    GoldCube       = gluNewQuadric();
    GoldCubeTop    = gluNewQuadric();
    GoldCubeBottom = gluNewQuadric();

for (int i=1;i<BMP_MAX;i++)
    {if (BMP==i)   glBindTexture(GL_TEXTURE_2D,texture[i]); }
                     ///////////////////////

    gluQuadricTexture(GoldCube,         GL_TRUE);
    gluQuadricDrawStyle(GoldCube,       GLU_FILL);
    gluQuadricNormals(GoldCube,         GLU_SMOOTH);

    gluQuadricTexture(GoldCubeTop,      GL_TRUE);
    gluQuadricDrawStyle(GoldCubeTop,    GLU_FILL);
    gluQuadricNormals(GoldCubeTop,      GLU_SMOOTH);

    gluQuadricTexture(GoldCubeBottom,   GL_TRUE);
    gluQuadricDrawStyle(GoldCubeBottom, GLU_FILL);
    gluQuadricNormals(GoldCubeBottom,   GLU_SMOOTH);

    glNewList(startoflist, GL_COMPILE);
    gluCylinder(GoldCube, ll, tt, hau, ray,25);
    glEndList();

    glNewList(startoflist + 1, GL_COMPILE);
    gluDisk(GoldCubeTop, hh0, tt, ray, 1);
    glEndList();

    glNewList(startoflist + 2, GL_COMPILE);
    gluDisk(GoldCubeBottom, hh1, tt, ray,1);
    glEndList();

   SwapBuffers(hdc);
    }
//---------------------------------------------------------------------------
void __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key,  TShiftState Shift)
{
    tmp=1;
    if(Key == VK_UP)      glRotatef(-5, 1.0, 0.0, 0.0);
    if(Key == VK_DOWN)    glRotatef(5 , 1.0, 0.0, 0.0);
    if(Key == VK_LEFT)    glRotatef(-5, 0.0, 1.0, 0.0);
    if(Key == VK_RIGHT)   glRotatef(5 , 0.0, 1.0, 0.0);

    if(Key == char('Q'))  X0=X0+5;
    if(Key == char('W'))  X0=X0-5;
    if(Key == char('S'))  Y0=Y0+5;
    if(Key == char('X'))  Y0=Y0-5;
    if(Key == char('D'))  Z0=Z0+5;
    if(Key == char('C'))  Z0=Z0-5;

   }
//---------------------------------------------------------------------------
void __fastcall TForm2::SetupTextures()
{

              bitmap = new Graphics::TBitmap;
              GLubyte bits[64][64][4];

for ( int BMP=1; BMP <BMP_MAX; BMP++) {

         if (BMP == 1 ) bitmap->LoadFromFile("blue.bmp");
         if (BMP == 2 ) bitmap->LoadFromFile("red.bmp");
         if (BMP == 3 ) bitmap->LoadFromFile("Texture.bmp");
         if (BMP == 4 ) bitmap->LoadFromFile("Wall.bmp");
         if (BMP == 5 ) bitmap->LoadFromFile("gold.bmp");
  for(int i = 0; i < 64; i++)
    {
    	for(int j = 0; j < 64; j++)
        {
            bits[i][j][0]= (GLbyte)GetRValue(bitmap->Canvas->Pixels[i][j]);
            bits[i][j][1]= (GLbyte)GetGValue(bitmap->Canvas->Pixels[i][j]);
            bits[i][j][2]= (GLbyte)GetBValue(bitmap->Canvas->Pixels[i][j]);
            bits[i][j][3]= (GLbyte)255;
        }
    }
    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
    glGenTextures(1, &texture[BMP]);
    glBindTexture  (GL_TEXTURE_2D, texture[BMP]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(   GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, bits);  }
            ////////////////////////////////////////////////

    glEnable(GL_TEXTURE_2D);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    }
//-----------------------------------------------------------------------
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
 if (tmp==1) {
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       tmp=0;

int nbr=6;
for (g=0;g<=nbr-1; g++) {
int DR[10][10]=
//  ray   hh0  hh1   ll   tt  || haut  XX    YY    ZZ    BMP   exemples
   {{4   ,0    ,0   ,50  ,50    ,50   ,100   ,0    ,0    ,3},  // Cube
    {16  ,50   ,0   ,0   ,50    ,50   ,1     ,80   ,20   ,2},  // Cône
    {16  ,20   ,20  ,50  ,50    ,50   ,10    ,60   ,-100 ,1},  // Cylindre percé
    {3   ,50   ,0   ,0   ,50    ,50   ,-100  ,10   ,15   ,4},  // pyramide 3
    {4   ,50   ,0   ,0   ,50    ,50   ,-10   ,0    ,150  ,3},  // pyramide 4
    {4   ,50   ,0   ,50  ,50    ,50   ,8     ,0    ,80   ,5},  // Cube sans couvercle
    };

ray=DR[g][0];
hh0=DR[g][1];
hh1=DR[g][2];
 ll=DR[g][3];
 tt=DR[g][4];
hau=DR[g][5];
 XX=DR[g][6]+X0;
 YY=DR[g][7]+Y0;
 ZZ=DR[g][8]+Z0;
BMP=DR[g][9];
      DrawObjects();
}
         }

}
//---------------------------------------------------------------------------

Conclusion :


Mon soft sera mis à jours , selon les modifications reçu.

pas de bugs connus sur mon PC.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

VCL c un en-tête utilisé par borland poru gérer les boutons, champs edit, etc de windows si je ne m'abuse.
Messages postés
166
Date d'inscription
mercredi 24 avril 2002
Statut
Membre
Dernière intervention
23 juin 2009

c'est koi c'est header vcl.h et opengl.h tu conais glut gl glu glaux ...
Messages postés
334
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
3 juillet 2010

c nul, ce que j’ai réaliser, je recommence tout avec les glVertex3i, c mieux, on contrôle tout.
je suis entrain de réaliser un programme qui permettra de choisir l’image BMP pour chaque fasse d’un cube par exemple.

Il y aura :
un cube ou l’on choisira les face que l’on veux afficher,le cône,
sphère, ½ sphère, cylindre, ½ cylindre dans le sens de la longueur, un pyramide 3 et 4 face,.........
Et on pourra choisir la hauteur, largeur, zoom,.....

J’ai réussi à faire un cercle, le problème c qu’avec « glVertex3i »
Je ne pourrai pas mettre une image BMP dans le cercle
Avec « glVertex3i », il faut 4pts pour réaliser un arc de cercle, c moche, même ci on rapproche les pts

Help Me
Je voudrai réaliser un cercle et que je puise mettre une image BMP comme le cube sans GlutSolidSPhere.
Quand, je serai faire ce cercle , la suite sa sera tout simple
@+
Messages postés
192
Date d'inscription
vendredi 2 mars 2001
Statut
Membre
Dernière intervention
10 janvier 2006

Pas mal du tout! N'oubli pas que tu peux utiliser l'antialiasing :
glEnable(GL_POINT_SMOOTH ) pour les points

glEnable(GL_LINE_SMOOTH ) pour les lignes

glEnable(GL_POLYGON_SMOOTH ) pour les polys
Attention n'utilise qu'une sorte d'antialiasing a la fois! Ce serait con sinon ;)! donc voila autrement c'est po mal!
GEFF
Messages postés
192
Date d'inscription
vendredi 2 mars 2001
Statut
Membre
Dernière intervention
10 janvier 2006

Pas mal du tout! N'oubli pas que tu peux utiliser l'antialiasing :
glEnable(GL_POINT_SMOOTH ) pour les points

glEnable(GL_LINE_SMOOTH ) pour les lignes

glEnable(GL_POLYGON_SMOOTH ) pour les polys
Attention n'utilise qu'une sorte d'antialiasing a la fois! Ce serait con sinon ;)! donc voila autrement c'est po mal!
GEFF

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.