voila un petit programme qui reprensente une pseudo-galaxie (elle a une forme d'un cube ...) il en plus il existe 3 type de planetes !! (rouge,vert,bleu)
bon elles sont reprensentees par un point (c'est ca le but de la source)
Source / Exemple :
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>
#include <math.h>
//------------------------------------------------------------
#define PI 3.1415926535
//------------------------------------------------------------
#define MY_MIN_ZOOM 1
#define MY_MAX_ZOOM 100
#define NBPOINT 5000
#define MY_CUBE_LINE 99
#define MY_PLANET_1 100
#define MY_PLANET_2 101
#define MY_PLANET_3 102
//------------------------------------------------------------
double CompiloRandomDouble(double a,double b)
{
return a + ((b-a)*(double)rand())/((double)RAND_MAX);
}
//------------------------------------------------------------
void RePaint(HDC DC,double zoom,double theta,double phi)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// position de l'oeil
gluLookAt(zoom*cos(theta)*cos(phi),zoom*sin(theta)*cos(phi),zoom*sin(phi),0,0,0,cos(theta-PI)*cos(PI/2.-phi),sin(theta-PI)*cos(PI/2.-phi),sin(PI/2.-phi));
// on trace les lignes du cube
glCallList(MY_CUBE_LINE);
glCallList(MY_PLANET_1);
glCallList(MY_PLANET_2);
glCallList(MY_PLANET_3);
glPopMatrix();
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);
}
//------------------------------------------------------------
void CreatePlanet(int ID,double r,double g,double b)
{
int i;
glNewList(ID,GL_COMPILE);
glColor3d(r,g,b);
glBegin(GL_POINTS);
for(i=0;i<NBPOINT;i++)
{
double x,y,z;
x = CompiloRandomDouble(-10.,+10.);
y = CompiloRandomDouble(-10.,+10.);
z = CompiloRandomDouble(-10.,+10.);
glVertex3d(x,y,z);
}
glEnd();
glEndList();
}
//------------------------------------------------------------
void CreateNewList(void)
{
glNewList(MY_CUBE_LINE,GL_COMPILE);
glColor3d(1.,1.,1.);
glBegin(GL_LINE_LOOP);
glVertex3d(-10.,-10.,-10.);
glVertex3d(-10.,-10.,+10.);
glVertex3d(-10.,+10.,+10.);
glVertex3d(-10.,+10.,-10.);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d(+10.,-10.,-10.);
glVertex3d(+10.,-10.,+10.);
glVertex3d(+10.,+10.,+10.);
glVertex3d(+10.,+10.,-10.);
glEnd();
glBegin(GL_LINES);
glVertex3d(+10.,-10.,-10.);
glVertex3d(-10.,-10.,-10.);
glVertex3d(+10.,-10.,+10.);
glVertex3d(-10.,-10.,+10.);
glVertex3d(+10.,+10.,+10.);
glVertex3d(-10.,+10.,+10.);
glVertex3d(+10.,+10.,-10.);
glVertex3d(-10.,+10.,-10.);
glEnd();
glEndList();
CreatePlanet(MY_PLANET_1,1.,0.,0.);
CreatePlanet(MY_PLANET_2,0.,1.,0.);
CreatePlanet(MY_PLANET_3,0.,0.,1.);
}
//------------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
static HDC DC;
static HGLRC RC;
static int cxClient,cyClient;
static double zoom,theta,phi,_theta,_phi;
static BOOL isMouseDown;
static int xMouseStart,yMouseStart;
// traitement des messages
switch (iMsg)
{
case WM_CREATE:
{
DC = GetDC(hwnd);
InitPixelFormat(DC);
RC = wglCreateContext(DC);
wglMakeCurrent(DC,RC);
glEnable(GL_DEPTH_TEST);
glClearColor(0,0,0,0);
zoom = 50.;
theta = 0.;
phi = 0.;
CreateNewList();
break;
}
case WM_SIZE:
{
cxClient = LOWORD(lParam); cxClient = (cxClient ? cxClient : 1);
cyClient = HIWORD(lParam); cyClient = (cyClient ? cyClient : 1);
glViewport(0,0,cxClient,cyClient);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.,(float)(cxClient)/(float)(cyClient),0.1,1000);
break;
}
case WM_CHAR:
{
switch((char)wParam)
{
case 'a':
{
zoom -= 1.;
if(zoom < MY_MIN_ZOOM) zoom = MY_MIN_ZOOM;
return 0;
}
case 'q':
{
zoom += 1.;
if(zoom > MY_MAX_ZOOM) zoom = MY_MAX_ZOOM;
return 0;
}
case 'w':
{
CreateNewList();
return 0;
}
}
break;
}
case WM_LBUTTONDOWN:
{
xMouseStart = LOWORD(lParam);
yMouseStart = HIWORD(lParam);
// on sauvegarde les angles
_theta = theta;
_phi = phi;
isMouseDown = TRUE;
SetCapture(hwnd);
return 0;
}
case WM_LBUTTONUP:
{
if(isMouseDown)
{
ReleaseCapture();
isMouseDown = FALSE;
}
return 0;
}
case WM_MOUSEMOVE:
{
if(isMouseDown)
{
int x,y;
x = (int) (__int16) LOWORD(lParam);
y = (int) (__int16) HIWORD(lParam);
// attention, comme les coordonnees en Y
// client sont inversees (de haut en bas)
// il faut faire -, et non +
// comme pout le X
theta = _theta + ((xMouseStart - x)*2*PI)/(double)cxClient;
phi = _phi - ((yMouseStart - y)*2*PI)/(double)cyClient;
}
return 0;
}
case WM_PAINT:
{
RePaint(DC,zoom,theta,phi);
return 0;
}
case WM_DESTROY:
{
glDeleteLists(MY_CUBE_LINE,1);
wglMakeCurrent(NULL, NULL);
wglDeleteContext(RC);
ReleaseDC(hwnd,DC);
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}
//------------------------------------------------------------
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
WNDCLASS wc;
MSG msg;
HWND hWnd;
srand((unsigned)GetTickCount());
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 = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "jcd";
RegisterClass(&wc);
hWnd = CreateWindow("jcd","openGl : Une Galaxie ... (JCD)",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
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.