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...
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.