Globe terrestre

Description

C'est une utilisation d'OpenGL avec texture(BMP carte du monde), transparance et isolation d'une matrice autour d'un objet

Source / Exemple :


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

WNDCLASS wc;
MSG msg;
HWND hWnd;
HDC	DC;
HGLRC RC;
double a;
double b;

int x,z=-10,filt,tex=1,zbuff=1,pom=1;
unsigned texture[2];
GLUquadricObj *Quadric1 = gluNewQuadric();
void RePaint ()
{
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode (GL_MODELVIEW);	
	glLoadIdentity ();
	if (zbuff) glEnable (GL_DEPTH_TEST);
		else glDisable (GL_DEPTH_TEST);
	if (tex) glEnable(GL_TEXTURE_2D);
		else glDisable (GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, texture[filt]);
	a+=pom;
	gluQuadricTexture(Quadric1, true);

	//glRotated(d,0,1,0);
	gluLookAt(0,0,z,0,0,z+1,0,1,0);

	glEnable (GL_DEPTH_TEST);
	glRotated(b,1,0,0);
	glRotated(a,0,1,0);
	glPushMatrix();
	glRotated(-90,1,0,0);
	glDisable (GL_BLEND);
	glColor3f(1,1,1);
	gluQuadricDrawStyle(Quadric1, GLU_FILL);
	gluSphere(Quadric1, 3, 7200, 3600); 
	glEnable (GL_BLEND);
	glColor4f(1,1,1,0.125);
	glBindTexture(GL_TEXTURE_2D, texture[1]);
	gluQuadricDrawStyle(Quadric1, GLU_LINE);
	gluSphere(Quadric1, 3.1, 36, 18); 
	glPopMatrix();

SwapBuffers (DC);

}	
	
void LoadTexture() 
{
	AUX_RGBImageRec *texture1;
	texture1 = auxDIBImageLoad("machin.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_NEAREST);
	glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 	0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
};

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:
		ShowCursor(false);
		DC=GetDC (hwnd);
        InitPixelFormat (DC);
        RC = wglCreateContext (DC);
        wglMakeCurrent (DC, RC);
        glEnable (GL_DEPTH_TEST); 
        glClearColor (0,0,0,0); 
		LoadTexture();
		glBlendFunc(GL_SRC_ALPHA, GL_ONE);
		break;
	case WM_KEYDOWN:
		switch (wParam) {
			case VK_ESCAPE:
				PostQuitMessage(0);
			case VK_DOWN:
				z--;
				break;
			case VK_UP:
				z++;
				break;
			case VK_SPACE:
				if (pom) pom=0;
				else pom=1;
				break;
			case VK_RIGHT:
				b++;
				break;
			case VK_LEFT:
				b--;
				break;
			default:
				break;
			return 0;
		}
	
		return 0;
	case WM_CLOSE:
		gluDeleteQuadric(Quadric1);
		ShowCursor(true);
        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,1000);
    	break;
    case WM_PAINT:
    	RePaint ();
    	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 = CreateWindowEx
	(WS_EX_TOPMOST, "OGL", "Fenetre OpenGL", 
	WS_POPUP | WS_VISIBLE,
	0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL
	);
	
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	return 0;
}

Conclusion :


Ce code etait juste un test et il n'est pas prevu de suite cependant, il peut facilement etre reutilise pour quelque chose de plus complexe.
Pour l'utiliser: les fleches (distance et rotation) et la barre d'espace (arret).

Codes Sources

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.