Animation open gl

Soyez le premier à donner votre avis sur cette source.

Vue 9 875 fois - Téléchargée 494 fois

Description

C' est tout simplement une sphère + une texture de sphère qui tourne avec des fonctions :
éssayer c' est touches :
a,b,espace...

Source / Exemple :


#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

WNDCLASS wc;
MSG msg;
HWND hWnd;
HDC	DC;
HGLRC RC;

unsigned texture[2];
int x,z=-5,filt,tex=1,zbuff=1,fog,rot;
float fogcolor[4] = {0.5f,0.5f,0.5f,1};

GLUquadricObj *Quadric1 = gluNewQuadric();

void LoadTexture()
{
	AUX_RGBImageRec *texture1;
	texture1 = auxDIBImageLoad("machin.bmp");
	glGenTextures (2, &texture[0]);

	glBindTexture (GL_TEXTURE_2D, texture[0]);
	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, 3, texture1->sizeX, texture1->sizeY, 0,
    GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
	
	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 RePaint()
{
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode (GL_MODELVIEW);	
	glLoadIdentity ();

	gluLookAt(x,0,z,x,0,z+10,0,1,0);

    if (zbuff) glEnable(GL_DEPTH_TEST);
		else glDisable(GL_DEPTH_TEST);

    if (tex) glEnable(GL_TEXTURE_2D);
		else glDisable(GL_TEXTURE_2D);
	
	if (fog) glEnable(GL_FOG);
		else glDisable(GL_FOG);

	glBindTexture(GL_TEXTURE_2D, texture[filt]);

	gluQuadricTexture(Quadric1, TRUE);
	gluQuadricDrawStyle(Quadric1, GLU_FILL);

	rot++;
	glRotated(rot,0,1,0);
	gluSphere(Quadric1,4,50,50);

	SwapBuffers (DC);
}

void InitPixelFormat (HDC hDC)
{
      PIXELFORMATDESCRIPTOR pfd =
      {
           sizeof (PIXELFORMATDESCRIPTOR),
           1,
           PFD_SUPPORT_OPENGL | PFD_TYPE_RGBA | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER,
           16,
           0, 0, 0, 0, 0, 0, 0, 0,	0, 0, 0, 0, 0,
           16,
           0, 0, 0, 0, 0, 0, 0
      };

      SetPixelFormat (hDC, ChoosePixelFormat (hDC, &pfd), &pfd);
}

LRESULT CALLBACK WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_CREATE:
		DC=GetDC (hwnd);
        InitPixelFormat (DC);
        RC = wglCreateContext (DC);
        wglMakeCurrent (DC, RC);
        glEnable (GL_DEPTH_TEST);
		glEnable(GL_TEXTURE_2D);
        glClearColor (0.5f,0.5f,0.5f,1);
		glFogfv(GL_FOG_COLOR, fogcolor);
		glFogi(GL_FOG_MODE, GL_EXP);
		glHint(GL_FOG_HINT, GL_NICEST);
		glFogf(GL_FOG_DENSITY, 0.3f);
		glFogf(GL_FOG_START, 1.0);
		glFogf(GL_FOG_END, 5.0);
        LoadTexture();
		break;
	case WM_CLOSE:
        wglMakeCurrent (NULL, NULL);
        wglDeleteContext (RC);
        ReleaseDC (hwnd,DC);
		PostQuitMessage (0);
		break;
    case WM_SIZE:
    	glViewport (0,0,LOWORD (lParam),HIWORD (lParam));
    	glMatrixMode (GL_PROJECTION);
    	glLoadIdentity ();
    	gluPerspective (45,(float)(LOWORD(lParam))/(float)(HIWORD(lParam)),1,100);
    	break;
    case WM_PAINT:
    	RePaint ();
    	break;
	case WM_KEYDOWN:
		switch (wParam) {
		case VK_DOWN:
			z--;
			break;
		case VK_UP:
			z++;
			break;
		case VK_RIGHT:
			x--;
			break;
		case VK_LEFT:
			x++;
			break;
		case 'F':
			filt=!filt;
			break;
		case 'T':
			tex=!tex;
			break;
		case 'Z':
			zbuff=!zbuff;
			break;
		case 'B':
			fog=!fog;
			break;
        case 'A':
            rot++ +rot++ +rot++;
		}
		break;

	default:
		return DefWindowProc (hwnd,uMsg,wParam,lParam);
		break;
	}
	return 0;
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
	wc.style = CS_OWNDC;
	wc.lpfnWndProc = WindowProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = "OGL";
	
	RegisterClass(&wc);

	hWnd = CreateWindow
	("OGL", "Fenetre OpenGL",
	WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
	0, 0, 640, 480, NULL, NULL, hInstance, NULL
	);

	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}

Conclusion :


Voila, pour les nobs c compliqué et pour ceux qui pratique open GL ca sera bien utile...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
dimanche 22 décembre 2002
Statut
Membre
Dernière intervention
2 novembre 2003

C'est clair qu'il y a plus commentée comme source !!!
Tu nous facilites pas la tache a nous (noob comme tu nous appelles)

Erf, execellent pour faire du copier/coller, incomprehensible sinon
Messages postés
41
Date d'inscription
mercredi 19 juin 2002
Statut
Membre
Dernière intervention
6 juillet 2004

c bien pour une première approche de l'opengl, mais c dommage que tu ne mettes pas de commentaire pour expliquer à ceux qui ne connaissent pas.

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.