A ce point là ? mdr
J'ai effectivement commencé l'opengl il y a de cela 2 jours
En fait, ce que je cherche à faire c'est un espace 3d dans lequel je peux me balader.
Je ne sais pas si j'ai choisis la bonne méthode, mais j'ai fais un petit machin qui m'a l'air de plus ou moins fonctionner.
Seulement voilà, je lis partout qu'il faut utiliser les matrices... et moi ben... zéro matrices
Pourtant ça m'a l'air de fonctionner...
Si quelqu'un pouvait y jetter un coup d'oeil et me dire si c'est réellement plus simple par matrice, je lui en serais extrèmement reconnaissant
**************************************************
**
#include<gl/glut.h>
#include<stdio.h>
#include<math.h>
int LightPos[4] = {0,0,3,1};
int MatSpec [4] = {1,1,1,1};
int WindowName;
double a=0;
const double PI = acos (-1.0);
double rad;
double px=0.0, py=1.0, pz=20.0;
double vx=0.0, vy=0.0, vz=0.0;
double savex=vx, savey=vy;
double angle_x, angle_y;
double sensibilite=1.0;
double vitesse=0.1;
void Reshape(int width, int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.1f, float(width)/float(height), 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
}
void Draw()
{
glMaterialiv(GL_FRONT_AND_BACK,GL_SPECULAR,MatSpec);
glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,100);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(px,py,pz,vx,vy,vz,0,1,0);
glRotated(a,0,1,0);
glLightiv(GL_LIGHT0,GL_POSITION,LightPos);
glRotated(-a,0,1,0);
glutSolidSphere(1,50,50);
a +=0.1 ;
glBegin (GL_LINES);
glVertex3i(0,0,-40); glVertex3i(0,0,40);
glVertex3i(0,-40,0); glVertex3i(0,40,0);
glVertex3i(-40,0,0); glVertex3i(40,0,0);
glEnd();
glutSwapBuffers();
glutPostRedisplay();
}
void InitGL()
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
rad = sensibilite/180.0 * PI;
angle_x = 90.0/180.0 * PI;
angle_y = 90.0/180.0 * PI;
vx = 10*cos(angle_x);
vy = 10*cos(angle_y);
}
double AngleXY()
{
double res;
double k = vx-px;
double m = vz-pz;
if (k!=0 || m!=0) {
res = fabs(k) / sqrt(k*k+m*m);
if (k<0) {
if (m<0) res = PI - acos(res);
else res = PI + acos(res);
}
else if (m<0) res = acos(res);
else res = 2*PI - acos(res);
}
else {
if (py == 0) printf("error angleXY\n" );
else res = acos(1);
}
return res;
}
double AngleXZ()
{
double res=0;
double k = vy-py;
double l = vz-pz;
if (k!=0 || l!=0) {
res = fabs(k) / sqrt(k*k+l*l);
if (k<0) {
if (l<0) res = PI - acos(res);
else res = PI + acos(res);
}
else if (l<0) res = acos(res);
else res = 2*PI - acos(res);
}
else {
if (pz == 0) printf("error angleXZ\n" );
else res = acos(1);
}
return res;
}
void GestionSpecialClavier(int key, int x, int y)
{
switch (key) {
case GLUT_KEY_LEFT: {
if (glutGetModifiers() == GLUT_ACTIVE_SHIFT) vitesse = 0.4;
double angle_xy = AngleXY();
px -= vitesse*sin(angle_xy);
vx -= vitesse*sin(angle_xy);
if (angle_xy != 0) {
pz -= vitesse*cos(angle_xy);
vz -= vitesse*cos(angle_xy);
}
vitesse = 0.05;
break;
}
case GLUT_KEY_UP: {
if (glutGetModifiers() == GLUT_ACTIVE_SHIFT) vitesse = 0.4;
double angle_xy = AngleXY();
double angle_xz = AngleXZ();
if (angle_xz != PI/2) {
py += vitesse*cos(angle_xz);
vy += vitesse*cos(angle_xz);
}
pz += vitesse*fabs(sin(angle_xy))*-sin(angle_xz);
vz += vitesse*fabs(sin(angle_xy))*-sin(angle_xz);
if (angle_xy != 0) {
px += vitesse*cos(angle_xy)*fabs(sin(angle_xz));
vx += vitesse*cos(angle_xy)*fabs(sin(angle_xz));
}
vitesse = 0.05;
break;
}
case GLUT_KEY_RIGHT: {
if (glutGetModifiers() == GLUT_ACTIVE_SHIFT) vitesse = 0.4;
double angle_xy = AngleXY();
px += vitesse*sin(angle_xy);
vx += vitesse*sin(angle_xy);
if (angle_xy !=0) {
pz += vitesse*cos(angle_xy);
vz += vitesse*cos(angle_xy);
}
vitesse = 0.05;
break;
}
case GLUT_KEY_DOWN: {
if (glutGetModifiers() == GLUT_ACTIVE_SHIFT) vitesse = 0.4;
double angle_xy = AngleXY();
double angle_xz = AngleXZ();
if (angle_xz != PI/2) {
py -= vitesse*cos(angle_xz);
vy -= vitesse*cos(angle_xz);
}
pz -= vitesse*fabs(sin(angle_xy))*-sin(angle_xz);
vz -= vitesse*fabs(sin(angle_xy))*-sin(angle_xz);
if (angle_xy != 0) {
px -= vitesse*cos(angle_xy)*fabs(sin(angle_xz));
vx -= vitesse*cos(angle_xy)*fabs(sin(angle_xz));
}
vitesse = 0.05;
break;
}
case GLUT_KEY_PAGE_UP: {
sensibilite += 0.1;
rad = sensibilite/180.0 * PI;
break;
}
case GLUT_KEY_PAGE_DOWN:{
sensibilite -= 0.1;
rad = sensibilite/180.0 * PI;
break;
}
case GLUT_KEY_HOME: {
vx = 0; vy = 0; vz = 0;
break;
}
}
}
void GestionClavier(unsigned char key, int x, int y)
{
if (key=='a') {
printf ("angle avec le plan xy: %f\n",AngleXY()/PI * 180.0);
printf ("angle avec le plan xz: %f\n",AngleXZ()/PI * 180.0);
}
if (key=='c') printf("coord: (%f,%f,%f)\n",px,py,pz);
if (key=='r') {
px = -px; py = -py; pz = -pz;
vx = -vx; vy = -vy; vz = -vz;
}
if (key=='v') printf("vision: (%f,%f,%f)\n",vx,vy,vz);
if (key==27) exit(0);
}
void GestionMouvementSouris(int x, int y)
{
int save;
if (x < savex)
{
save = x;
while (x < savex) {
angle_x -= rad;
vx = 10*cos(angle_x) + px;
vz = 10*sin(angle_x) + pz;
++x;
}
savex = save;
}
else if (x > savex)
{
save = x;
while (x > savex) {
angle_x += rad;
vx = 10*cos(angle_x) + px;
vz = 10*sin(angle_x) + pz;
--x;
}
savex = save;
}
else if (y < savey)
{
save = y;
while (y < savey) {
angle_y += rad;
vy = 10*cos(angle_y) + py;
vz = 10*sin(angle_y) + pz;
++y;
}
savey = save;
}
else
{
save = y;
while (y > savey) {
angle_y -= rad;
vy = 10*cos(angle_y) + py;
vz = 10*sin(angle_y) + pz;
--y;
}
savey = save;
}
}
int main (int argc, char *argv[ ], char *envp[ ])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800,600); glutInitWindowPosition (100,100);
WindowName = glutCreateWindow("Ma première fenêtre OpenGL !" );
glutReshapeFunc(Reshape);
glutDisplayFunc(Draw);
InitGL();
glutKeyboardFunc(GestionClavier);
glutSpecialFunc(GestionSpecialClavier);
glutPassiveMotionFunc(GestionMouvementSouris);
glutMainLoop();
return 0;
}
****************************************************