Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, OpenGL] Problem przy rysowaniu piramidy

Ostatnio zmodyfikowano 2013-12-23 01:35
Autor Wiadomość
camillos90
Temat założony przez niniejszego użytkownika
[C++, OpenGL] Problem przy rysowaniu piramidy
» 2013-12-23 00:58:11
Witam, mam dziwny problem przy próbie narysowania piramidy (piramida składa sie z 8 trójkątów). Mimo że w kodzie nie używam kolorów z Alfą to mam wrażenie jakby niektóre z nich były przezroczyste i było przez nie widać część innej ściany. Wyszukałem w necie że może to być winna nie ustawienia normalnych, ale mimo iż wyliczyłem je dla każdego z wierzchołków nic to nie pomogło.

Debugowałem również program, aby sprawdzić czy przezroczyste trójkąty są rysowane tak samo jak poprawne i w oby przypadkach jest to ruch przeciwnie do wskazówek zegara.
Nie mam jak pokazać współrzędnych trójkątów bo generuje je triangulacją delanay na podstawie punktów równomiernie rozłożonych na kwadracie.

Część rysująca piramidę wygląda tak:

C/C++
glBegin( GL_TRIANGLES );
Point3D * normal;
for( int i = 0; i < triangleInMesh && i < tringlesCountToDraw; i++ )
{
    //glNormal3d(triangleNormals[i].X, triangleNormals[i].Y, triangleNormals[i].Z);
   
    if( mesh[ i ].Point1->Y > 0 ) glColor3f( 0.0, 0.0, 1.0 ); else glColor3f( 0.0, 0.2, 0.0 );
   
    normal = GetNormal( mesh[ i ].Point1 );
    glNormal3f( normal->X, normal->Y, normal->Z );
    glVertex3f( mesh[ i ].Point1->X, mesh[ i ].Point1->Y, mesh[ i ].Point1->Z );
   
    if( mesh[ i ].Point2->Y > 0 ) glColor3f( 0.0, 0.0, 1.0 ); else glColor3f( 0.0, 0.2, 0.0 );
   
    normal = GetNormal( mesh[ i ].Point2 );
    glNormal3f( normal->X, normal->Y, normal->Z );
    glVertex3f( mesh[ i ].Point2->X, mesh[ i ].Point2->Y, mesh[ i ].Point2->Z );
   
    if( mesh[ i ].Point3->Y > 0 ) glColor3f( 0.0, 0.0, 1.0 ); else glColor3f( 0.0, 0.2, 0.0 );
   
    normal = GetNormal( mesh[ i ].Point3 );
    glNormal3f( normal->X, normal->Y, normal->Z );
    glVertex3f( mesh[ i ].Point3->X, mesh[ i ].Point3->Y, mesh[ i ].Point3->Z );
   
}

glEnd();




Link do screena z poprawnie wyświetlanej ściany:
http://i42.tinypic.com/201qg3.jpg

Link do błędnie wyświetlanej ściany:
http://i42.tinypic.com/k2d6ko.jpg
P-99898
DejaVu
» 2013-12-23 01:09:45
Jeżeli nie używasz oświetlenia, to normalne nie mają znaczenia. Jeżeli ściany Ci się źle renderują to być może nie włączyłeś bufora głębi.
P-99903
DejaVu
» 2013-12-23 01:12:06
P-99904
camillos90
Temat założony przez niniejszego użytkownika
» 2013-12-23 01:20:50
Delaunay Triangulation :)

Edit:
dodałem przed beginem
glEnable(GL_DEPTH_TEST);

to się w ogóle nie rysują, a pomiedzy Begin - End, nie naprawia to błędu
P-99906
DejaVu
» 2013-12-23 01:24:14
Hm... a ten algorytm działa w przestrzeni? :P Bo tak na tym aplecie co podesłałem, to scena jest 2D :)

/edit:
http://cpp0x.pl/kursy​/Kurs-OpenGL-C++​/Bufor-glebokosci/225

Patrz ostatni kod źródłowy :)
P-99908
camillos90
Temat założony przez niniejszego użytkownika
» 2013-12-23 01:26:52
Siatka była generowana w 2d, później dołożyłem jedną współrzędna - a środkowy punkt podniosłem na niej.
P-99909
DejaVu
» 2013-12-23 01:29:34
Spróbuj najpierw narysować sobie obracający się sześcian (każda ściana rysowana innym kolorem). Jak sześcian zadziała, to Twój problem też powinien się rozwiązać :)
P-99910
camillos90
Temat założony przez niniejszego użytkownika
» 2013-12-23 01:35:07
Naprawione.

1. Wyczyścić go DEPTH_BUFFOR (tego nie zrobiłem - i dlatego nie działało)
2. Włączyć GL_DEPTH_TEST
3. Narysować piramidę.
4. Wyłączyć GL_DEPTH_TEST

Dzięki za pomoc :)
P-99911
« 1 »
  Strona 1 z 1