Bienvenue sur nos forums !
Vous n'êtes pas identifié.
Bonjour,
J'ai un petit problème incompréhensible.
J'ai un fichier rempli de coordonnées de points formant des polygones(les 3 coordonnées sur une ligne, avec des séparateurs). Je lis donc les lignes de ce fichier, je les découpe selon les séparateurs, je remplis un vector, et j'appelle glVertex. Là, c'est le drame. Le rendu que j'ai ressemble plutôt à un genre d'animation...
Pour l'instant, j'essaie de n'afficher qu'un seul polygone, mais ce qui s'affiche c'est plusieurs polygones a des places différentes et qui s'effacent dans la demi seconde...
J'ai testé mon code sans lire le fichier, et là j'ai bien un beau polygone qui s'affiche et qui ne bouge pas (je remplis le vector à la main).
Comme dans le fichier tout est en string, et que je dois avoir des float à afficher, j'utilise une variable de type istringstream pour passer de l'un à l'autre. Je me suis demandée si c'était ça, mais j'ai essayé avec atof, et c'est pareil.
A votre avis, de quoi ça peut venir?
Hors ligne
Ca vient des valeurs.
Vérifie les valeurs que tu as en mémoire en les affichant pour voir ce que tu as.
Hors ligne
Merci de m'avoir répondu.
J'affiche mes valeurs (depuis déjà un moment), et rien ne semble anormal, d'où mon message sur ce forum... Donc quand je parse le fichier texte, tout est lu normalement, quand j'affiche le résultat tout va bien, mais dès que je fais un glVertex3f, ça affiche la facette juste un moment, puis plus rien.
En écrivant les valeurs à la main (pas depuis un fichier), ça s'affiche comme il faut...
Un screenshot ne serait pas de trop tu sais.
Hors ligne
Pour ce qui est de l'affichage, ça affiche bien le bon polygone maintenant, mais il disparaît en 1/2 seconde...
Pour ce qui est de mon code, je me suis beaucoup inspirée des tutoriels de Jcom (en particulier le chapitre 10, mais sans textures et caméra en 3ème personne). Ce que j'ai rajouté pour afficher les polygones depuis un fichier, c'est :
ifstream fichier("toto.truc");
getline(fichier,ligne);
for (int i = 0; i<4; i++) //j'essaye déjà de lire un polygone à 4 côtés
{
istringstream temp(ligne);
temp >> float1 >> float2 >> float3;
coord.push_back(float1);
coord.push_back(float2);
coord.push_back(float3);
getline(fichier,ligne);
}
fichier.close();
glColor3d (0.84f,0.64f,0.97f);
int j = 0;
glBegin (GL_POLYGON);
while (j < coord.size()) //coord.size() = 12
{
glVertex3f (coord[j],coord[j+1],coord[j+2]);
j+=3;
}
glEnd();
Quand je remplis le vecteur à la main et que je fais pareil après, ça marche. J'ai testé les valeurs et la taille de mon tableau quand je le rempli depuis un fichier et tout me semble bon. Alors à votre avis c'est dû à quoi? à VC++?... (non, je ne suis pas fan de petit-doux).
Merci en tout cas de m'avoir déjà répondu.
J'ai essayé de m'inspirer du tutoriel n°3, toujours de Jcom, en lisant les coordonnées depuis un fichier de la forme
X t Y t Z n X t Y t Z n X t Y t Z n X t Y t Z n -- X t Y t Z n X t Y t Z n ...
J'utilise la même méthode que précédemment, et ça ne fonctionne toujours pas.
Par rapport à ma méthode, j'ai testé la lecture dans le fichier, le type, les istringstream, la conversion en float, bref tout ce qui pouvait merder, mais tout semble fonctionner, sauf l'affichage...
A votre avis, c'est OpenGL qui a du mal sous visual ou alors c'est visual tout court qui est la cause de tous ces problèmes?
Si quelqu'un a réussi, sous visual, à lire des coordonnées depuis un fichier, je lui serais très reconnaissante de me dire comment il a fait, parce que là je sèche...
Hors ligne
Mais tu fais quoi dans ta loop principale ?
Hors ligne
J'ai essayé vite fait en utilisant le tutoriel 3 de Jcom, mais ça fait toujours pareil, ça apparaît un instant, puis plus rien. Comme cette version est moins "grosse" que l'autre fichier que j'utilise, voilà le code entier :
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <gl/gl.h>
#include <gl/glu.h>
using namespace std;
WNDCLASS wc;
MSG msg;
HWND hWnd;
HDC DC;
HGLRC RC;
vector<GLdouble> coord;
ifstream fichier("toto.txt");
string ligne;
GLdouble double1;
GLdouble double2;
GLdouble double3;
void RePaint ()
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (7,7,-10,0,0,0,0,1,0);
glEnable(GL_DEPTH_TEST);
coord.clear();
getline(fichier,ligne);
istringstream temp(ligne);
for (int i = 0; i<4; i++)
{
temp >> double1 >> double2 >> double3;
coord.push_back(double1);
coord.push_back(double2);
coord.push_back(double3);
temp.clear();
getline(fichier,ligne);
temp.str(ligne);
}
temp.clear();
fichier.close();
glColor3d (0.84f,0.64f,0.97f);
int j = 0;
glBegin (GL_POLYGON);
while (j < coord.size()){
glVertex3d (coord[j],coord[j+1],coord[j+2]);
j+=3;
}
glEnd();
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);
glClearColor (0,0,1,0);
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;
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;
}
Donc voilà, ça ne passe pas sous visual c++, et je ne comprends vraiment pas pourquoi...
RePaint (); rajoute le dans le case default avant le return
Hors ligne
C'est fait. Alors maintenant, la fenêtre scintille un coup, mais n'affiche toujours pas le polygone.
Oui, c'est très tordu comme problème. Merci de m'aider quand même, on y viendra bien à bout un jour ou l'autre!
Hors ligne
...............................................................................................................
Bon, en fait ça ne marchait pas avec le RePaint dans le default parce que le fichier était ouvert en dehors du RePaint.... et donc forcément comme je fermais le fichier dans le RePaint... bon, désolée d'avoir bouletisé, ça marche maintenant.
Hors ligne
Bjr anasama!!
je travaille sur un projet dont une partie consiste à parcourir un fichier de coordonnées afin d'afficher des rectangles...
je voudrais savoir sous quel format il faut écrire les coordonnées dans le fichier.txt
pourrais-tu m'aider stp?!
Hors ligne