Accueil > > > CREATION D'UN OBJET 3D : LE TORUS
CREATION D'UN OBJET 3D : LE TORUS
Information sur la source
Description
voila ce que l'on peut faire avec seulement des triangles !
Source
- #include <windows.h>
- #include <gl/gl.h>
- #include <gl/glu.h>
- #include <gl/glaux.h>
- #include <math.h>
-
- //------------------------------------------------------------
- #define PI 3.1415926535897932384626433832795
- //------------------------------------------------------------
- #define EPSILON 0.001
- #define TIME_PER_TURN 10
- //------------------------------------------------------------
- #define MY_TORUS 1
- //------------------------------------------------------------
- void RePaint(HDC DC,double zoom,double theta,double phi)
- {
- static double q;
-
- if(TRUE)
- {
- static DWORD oldCall;
- DWORD t;
-
- t = GetTickCount();
-
- q += (360.*((double)(t - oldCall)))/(1000.*((double)TIME_PER_TURN));
-
- oldCall = t;
- }
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_TEXTURE_2D);
-
- glPushAttrib(GL_CURRENT_BIT);
-
- // 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));
-
- // les axes
- if(TRUE)
- {
- glColor3d(1.,1.,1.); // blanc
- glBegin(GL_LINES);
-
- glVertex3d(-500,0,0);
- glVertex3d(+500,0,0);
-
- glVertex3d(0,-500,0);
- glVertex3d(0,+500,0);
-
- glVertex3d(0,0,-500);
- glVertex3d(0,0,+500);
-
- glEnd();
- }
-
- // les torus
- if(TRUE)
- {
- glPushMatrix();
- glCallList(MY_TORUS);
- glPopMatrix();
- }
-
- // fin du dessinage
- glPopAttrib();
- 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);
- }
- //------------------------------------------------------------
- static void CalcPointTorus(double R,double r,double t,double a,double z)
- {
- glVertex3d(
- (R + r*cos(a))*cos(t),
- (R + r*cos(a))*sin(t),
- z+r*sin(a)
- );
- }
- //------------------------------------------------------------
- // creer un torus d'axes z de grand rayon <R> et de petit rayon <r>
- // le commencement de fait a z=0 et la fin a z=<dz>
- void MyCreateTorus(double R,double r,int nVertex,int slices,double angleBegin,double angleEnd,double dz)
- {
- double theta,stepTheta,oldTheta;
- double stepAlpha;
- double z,oldZ,stepDz;
-
- stepTheta = (angleEnd - angleBegin)/((double)nVertex);
- stepAlpha = 2.*PI/slices;
- stepDz = dz/((double)nVertex);
-
-
- glBegin(GL_TRIANGLE_STRIP);
-
- oldTheta = angleBegin;
- oldZ = 0.;
- z = stepDz;
-
- for(theta=angleBegin+stepTheta;theta<=angleEnd+EPSILON;theta+=stepTheta)
- {
- double a,b; // alpha,beta
-
- for(a=0.,b=0.5*stepAlpha;a<=2.*PI+EPSILON;a+=stepAlpha,b+=stepAlpha)
- {
- CalcPointTorus(R,r,oldTheta ,b,oldZ);
- CalcPointTorus(R,r,theta ,a,z);
- }
-
- oldTheta = theta;
- oldZ = z;
- z += stepDz;
- }
-
- glEnd();
- }
- //------------------------------------------------------------
- LRESULT CALLBACK WindowProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
- {
- static HDC hdc;
- static HGLRC hrc;
- 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:
- {
- hdc=GetDC(hwnd);
- InitPixelFormat(hdc);
- hrc = wglCreateContext(hdc);
- wglMakeCurrent(hdc,hrc);
- glEnable(GL_DEPTH_TEST);
- glClearColor(0,0,0,0);
-
- // creation des torus
- if(TRUE)
- {
- // support
- glNewList(MY_TORUS,GL_COMPILE);
-
- // premier figure
- glColor3d(1.,1.,0.1); // jaune
- glPushMatrix();
- MyCreateTorus(125.,4.,32,10,0.,2.*PI,0.);
- glRotated(90.,1.,0.,0.);
- MyCreateTorus(125.,4.,32,10,0.,2.*PI,0.);
- glRotated(90.,0.,1.,0.);
- MyCreateTorus(125.,4.,32,10,0.,2.*PI,0.);
- glPopMatrix();
-
- glColor3d(0.1,1.,0.1); // vert
- glPushMatrix();
- glTranslated(250.,0.,-250.);
- MyCreateTorus(125.,4.,200,10,0.,8.*PI,500.);
- glPopMatrix();
-
- glColor3d(1.,0.1,0.1); // rouge
- glPushMatrix();
- MyCreateTorus(500.,4.,32,10,0.,PI,0.);
- glRotated(120.,1.,0.,0.);
- MyCreateTorus(500.,4.,32,10,0.,PI,0.);
- glRotated(120.,1.,0.,0.);
- MyCreateTorus(500.,4.,32,10,0.,PI,0.);
- glPopMatrix();
-
- glColor3d(0.1,0.1,1.); // bleu
- glPushMatrix();
- glTranslated(-250.,0.,0.);
- glPushMatrix();
- glTranslated(0.,0.,-100.);
- MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
- glTranslated(0.,0.,200.);
- MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
- glPopMatrix();
- glRotated(90.,1.,0.,0.);
- glPushMatrix();
- glTranslated(0.,0.,-100.);
- MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
- glTranslated(0.,0.,200.);
- MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
- glPopMatrix();
- glRotated(90.,0.,1.,0.);
- glPushMatrix();
- glTranslated(0.,0.,-100.);
- MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
- glTranslated(0.,0.,200.);
- MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
- glPopMatrix();
- glPopMatrix();
-
- glEndList();
- }
-
-
- zoom = 1400.;
- // on veut les coordonnees de l'ecran (meme direction)
- theta = -PI/2;
- phi = -PI/2;
-
- break;
- }
- case WM_SIZE:
- {
- double r;
-
- cxClient = LOWORD(lParam); cxClient = (cxClient ? cxClient : 1);
- cyClient = HIWORD(lParam); cyClient = (cyClient ? cyClient : 1);
- glViewport(0,0,cxClient,cyClient);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- if(1 > (r = (float)(cxClient)/(float)(cyClient)))
- {
- //r = (float)(cyClient)/(float)(cxClient);
- }
-
- gluPerspective(45.,r,100.,100000.);
- break;
- }
- case WM_CHAR:
- {
- switch((char)wParam)
- {
- case 'a':
- {
- zoom -= 10.;
- return 0;
- }
- case 'q':
- {
- zoom += 10.;
- 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(hdc,zoom,theta,phi);
- return 0;
- }
- case WM_DESTROY:
- {
-
- glDeleteLists(MY_TORUS,1);
-
- wglMakeCurrent(NULL, NULL);
- wglDeleteContext(hrc);
- ReleaseDC(hwnd,hdc);
- 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;
-
- 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 = "jcdTorus";
-
- RegisterClass(&wc);
-
- hWnd = CreateWindow("jcdTorus","Objet 3D en OpenGL : Torus",
- WS_OVERLAPPEDWINDOW | WS_VISIBLE,
- CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
- NULL,NULL,hInstance,NULL
- );
-
- ShowWindow(hWnd,SW_SHOWMAXIMIZED);
- UpdateWindow(hWnd);
-
- while(GetMessage(&msg,NULL,0,0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
-
- return 0;
- }
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>
#include <math.h>
//------------------------------------------------------------
#define PI 3.1415926535897932384626433832795
//------------------------------------------------------------
#define EPSILON 0.001
#define TIME_PER_TURN 10
//------------------------------------------------------------
#define MY_TORUS 1
//------------------------------------------------------------
void RePaint(HDC DC,double zoom,double theta,double phi)
{
static double q;
if(TRUE)
{
static DWORD oldCall;
DWORD t;
t = GetTickCount();
q += (360.*((double)(t - oldCall)))/(1000.*((double)TIME_PER_TURN));
oldCall = t;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glPushAttrib(GL_CURRENT_BIT);
// 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));
// les axes
if(TRUE)
{
glColor3d(1.,1.,1.); // blanc
glBegin(GL_LINES);
glVertex3d(-500,0,0);
glVertex3d(+500,0,0);
glVertex3d(0,-500,0);
glVertex3d(0,+500,0);
glVertex3d(0,0,-500);
glVertex3d(0,0,+500);
glEnd();
}
// les torus
if(TRUE)
{
glPushMatrix();
glCallList(MY_TORUS);
glPopMatrix();
}
// fin du dessinage
glPopAttrib();
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);
}
//------------------------------------------------------------
static void CalcPointTorus(double R,double r,double t,double a,double z)
{
glVertex3d(
(R + r*cos(a))*cos(t),
(R + r*cos(a))*sin(t),
z+r*sin(a)
);
}
//------------------------------------------------------------
// creer un torus d'axes z de grand rayon <R> et de petit rayon <r>
// le commencement de fait a z=0 et la fin a z=<dz>
void MyCreateTorus(double R,double r,int nVertex,int slices,double angleBegin,double angleEnd,double dz)
{
double theta,stepTheta,oldTheta;
double stepAlpha;
double z,oldZ,stepDz;
stepTheta = (angleEnd - angleBegin)/((double)nVertex);
stepAlpha = 2.*PI/slices;
stepDz = dz/((double)nVertex);
glBegin(GL_TRIANGLE_STRIP);
oldTheta = angleBegin;
oldZ = 0.;
z = stepDz;
for(theta=angleBegin+stepTheta;theta<=angleEnd+EPSILON;theta+=stepTheta)
{
double a,b; // alpha,beta
for(a=0.,b=0.5*stepAlpha;a<=2.*PI+EPSILON;a+=stepAlpha,b+=stepAlpha)
{
CalcPointTorus(R,r,oldTheta ,b,oldZ);
CalcPointTorus(R,r,theta ,a,z);
}
oldTheta = theta;
oldZ = z;
z += stepDz;
}
glEnd();
}
//------------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
static HDC hdc;
static HGLRC hrc;
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:
{
hdc=GetDC(hwnd);
InitPixelFormat(hdc);
hrc = wglCreateContext(hdc);
wglMakeCurrent(hdc,hrc);
glEnable(GL_DEPTH_TEST);
glClearColor(0,0,0,0);
// creation des torus
if(TRUE)
{
// support
glNewList(MY_TORUS,GL_COMPILE);
// premier figure
glColor3d(1.,1.,0.1); // jaune
glPushMatrix();
MyCreateTorus(125.,4.,32,10,0.,2.*PI,0.);
glRotated(90.,1.,0.,0.);
MyCreateTorus(125.,4.,32,10,0.,2.*PI,0.);
glRotated(90.,0.,1.,0.);
MyCreateTorus(125.,4.,32,10,0.,2.*PI,0.);
glPopMatrix();
glColor3d(0.1,1.,0.1); // vert
glPushMatrix();
glTranslated(250.,0.,-250.);
MyCreateTorus(125.,4.,200,10,0.,8.*PI,500.);
glPopMatrix();
glColor3d(1.,0.1,0.1); // rouge
glPushMatrix();
MyCreateTorus(500.,4.,32,10,0.,PI,0.);
glRotated(120.,1.,0.,0.);
MyCreateTorus(500.,4.,32,10,0.,PI,0.);
glRotated(120.,1.,0.,0.);
MyCreateTorus(500.,4.,32,10,0.,PI,0.);
glPopMatrix();
glColor3d(0.1,0.1,1.); // bleu
glPushMatrix();
glTranslated(-250.,0.,0.);
glPushMatrix();
glTranslated(0.,0.,-100.);
MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
glTranslated(0.,0.,200.);
MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
glPopMatrix();
glRotated(90.,1.,0.,0.);
glPushMatrix();
glTranslated(0.,0.,-100.);
MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
glTranslated(0.,0.,200.);
MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
glPopMatrix();
glRotated(90.,0.,1.,0.);
glPushMatrix();
glTranslated(0.,0.,-100.);
MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
glTranslated(0.,0.,200.);
MyCreateTorus(100.,4.,32,10,0.,2.*PI,0.);
glPopMatrix();
glPopMatrix();
glEndList();
}
zoom = 1400.;
// on veut les coordonnees de l'ecran (meme direction)
theta = -PI/2;
phi = -PI/2;
break;
}
case WM_SIZE:
{
double r;
cxClient = LOWORD(lParam); cxClient = (cxClient ? cxClient : 1);
cyClient = HIWORD(lParam); cyClient = (cyClient ? cyClient : 1);
glViewport(0,0,cxClient,cyClient);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(1 > (r = (float)(cxClient)/(float)(cyClient)))
{
//r = (float)(cyClient)/(float)(cxClient);
}
gluPerspective(45.,r,100.,100000.);
break;
}
case WM_CHAR:
{
switch((char)wParam)
{
case 'a':
{
zoom -= 10.;
return 0;
}
case 'q':
{
zoom += 10.;
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(hdc,zoom,theta,phi);
return 0;
}
case WM_DESTROY:
{
glDeleteLists(MY_TORUS,1);
wglMakeCurrent(NULL, NULL);
wglDeleteContext(hrc);
ReleaseDC(hwnd,hdc);
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;
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 = "jcdTorus";
RegisterClass(&wc);
hWnd = CreateWindow("jcdTorus","Objet 3D en OpenGL : Torus",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL
);
ShowWindow(hWnd,SW_SHOWMAXIMIZED);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
PB LORS DE L'INSTALLATION SHAREPOINT 2010.PB LORS DE L'INSTALLATION SHAREPOINT 2010. par Patrick Guimonet
Lors de l'installation de SharePoint 2010, j'ai rencontré un problème de plantage à l'étape 5 du configuration Wizard. Ca se termine sur cet écran : Et en analysant le fichier de journalisation, on remarque vers la fin des 15000 et quelques lign...
Cliquez pour lire la suite de l'article par Patrick Guimonet [WF4] AJOUTER DES CONTRAINTES à UNE ACTIVITé (2/2)[WF4] AJOUTER DES CONTRAINTES à UNE ACTIVITé (2/2) par JeremyJeanson
Après mon précédent article qui attaque les contraintes par la fasse Nord de l'Everest. passons à la seconde possibilité offerte par WF4 pour valider une activité : la metadata . Je vous en ai déjà toucher un ou deux mots. La metadata dans WF4 est un élém...
Cliquez pour lire la suite de l'article par JeremyJeanson [WF4] AJOUTER DES CONTRAINTES à UNE ACTIVITé (1/2)[WF4] AJOUTER DES CONTRAINTES à UNE ACTIVITé (1/2) par JeremyJeanson
De WF3 à WF4 pas mal de choses on été changées pour faciliter la vie des développeurs, mais certain points peuvent sembler obscures. comme les contraintes. Pour vous guider, je me lance dans une série de deux articles. Ils présenterons deux approches poss...
Cliquez pour lire la suite de l'article par JeremyJeanson [ASP.NET] NE PAS SE FAIRE AVOIR PAR IHTTPMODULE ET SA MéTHODE INIT()[ASP.NET] NE PAS SE FAIRE AVOIR PAR IHTTPMODULE ET SA MéTHODE INIT() par tja
Beaucoup de développeurs pensent que lorsqu'on créé et enregistre un IHttpModule, il n'en existe qu'une seule instance et la méthode Init() sera appelée qu'une fois.
C'est faux
Cela peut vraiment créer des bugs subtils dont en ne se rend pas compte ...
Cliquez pour lire la suite de l'article par tja [MSTD10] SHAREPOINT 2010 ET TEAM FOUNDATION SERVER[MSTD10] SHAREPOINT 2010 ET TEAM FOUNDATION SERVER par phil
Un post rapide pour vous informer de la disponibilité de la vidéo de ma présentation sur SharePoint 2010 & Team Foundation Server. http://www.microsoft.com/france/vision/mstechdays10/Webcast.aspx?EID=20215d48-02e3-4d43-8c36-e53505c3b316 Dans la ...
Cliquez pour lire la suite de l'article par phil
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|