AP1994 Temat założony przez niniejszego użytkownika |
rysowanie czworokątów w Allegro 5 » 2024-08-23 20:08:03 ALLEGRO_VERTEX vtx[ ] = { { a1.get_x(), a1.get_y(), a1.get_z(), 0.0f, 0.0f, C1 }, { b1.get_x(), b1.get_y(), b1.get_z(), 0.0f, 0.0f, C1 }, { c1.get_x(), c1.get_y(), c1.get_z(), 0.0f, 0.0f, C1 }, { c1.get_x(), c1.get_y(), c1.get_z(), 0.0f, 0.0f, C1 }, { b1.get_x(), b1.get_y(), b1.get_z(), 0.0f, 0.0f, C1 }, { d1.get_x(), d1.get_y(), d1.get_z(), 0.0f, 0.0f, C1 }, { a2.get_x(), a2.get_y(), a2.get_z(), 0.0f, 0.0f, C2 }, { b2.get_x(), b2.get_y(), b2.get_z(), 0.0f, 0.0f, C2 }, { c2.get_x(), c2.get_y(), c2.get_z(), 0.0f, 0.0f, C2 }, { c2.get_x(), c2.get_y(), c2.get_z(), 0.0f, 0.0f, C2 }, { b2.get_x(), b2.get_y(), b2.get_z(), 0.0f, 0.0f, C2 }, { d2.get_x(), d2.get_y(), d2.get_z(), 0.0f, 0.0f, C2 } }; al_draw_prim( vtx, 0, 0, 0, 12, ALLEGRO_PRIM_TRIANGLE_LIST );
Przy użyciu powyższego kodu napisałem sobie funkcje, która wyświetla 2 czworokąty problem w tym, że kiedy je obracam wygląda to tak jakby 1 czworokąt był zawsze na wierzchu i zasłania 2 po obrocie. Jedyna różnica pomiędzy czworokątami polega na pozycji w osi z. Próbowałem urzyć: al_set_render_state(ALLEGRO_ALPHA_TEST, 1); al_set_render_state(ALLEGRO_DEPTH_TEST, 1); al_set_render_state(ALLEGRO_WRITE_MASK, ALLEGRO_MASK_RGBA|ALLEGRO_MASK_DEPTH); al_clear_depth_buffer(1.0); ale nie pomogło czy da się to jakoś naprawić w Allegro 5 |
|
pekfos |
» 2024-08-23 20:14:58 A jak je obracasz? |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2024-08-25 17:56:05 Używałem kodu: Point Shape::rotatePoint( Point p, float angle, Point axis, Point center ) { float s = sin( angle ); float c = cos( angle ); Point p2 = p - center; if( axis.get_x() == 1 ) { float y = p2.get_y() * c - p2.get_z() * s; float z = p2.get_y() * s + p2.get_z() * c; p2.set_y( y ); p2.set_z( z ); } else if( axis.get_y() == 1 ) { float x = p2.get_x() * c - p2.get_z() * s; float z = p2.get_x() * s + p2.get_z() * c; p2.set_x( x ); p2.set_z( z ); } else if( axis.get_z() == 1 ) { float x = p2.get_x() * c - p2.get_y() * s; float y = p2.get_x() * s + p2.get_y() * c; p2.set_x( x ); p2.set_y( y ); } return p2 + center; } void Cube::rotate( Point rad ) { float radX = rad.get_x(); a1 = rotatePoint( a1, radX, Point( 0, 1, 0 ), position ); b1 = rotatePoint( b1, radX, Point( 0, 1, 0 ), position ); c1 = rotatePoint( c1, radX, Point( 0, 1, 0 ), position ); d1 = rotatePoint( d1, radX, Point( 0, 1, 0 ), position ); a2 = rotatePoint( a2, radX, Point( 0, 1, 0 ), position ); b2 = rotatePoint( b2, radX, Point( 0, 1, 0 ), position ); c2 = rotatePoint( c2, radX, Point( 0, 1, 0 ), position ); d2 = rotatePoint( d2, radX, Point( 0, 1, 0 ), position ); float radY = rad.get_y(); a1 = rotatePoint( a1, radY, Point( 1, 0, 0 ), position ); b1 = rotatePoint( b1, radY, Point( 1, 0, 0 ), position ); c1 = rotatePoint( c1, radY, Point( 1, 0, 0 ), position ); d1 = rotatePoint( d1, radY, Point( 1, 0, 0 ), position ); a2 = rotatePoint( a2, radY, Point( 1, 0, 0 ), position ); b2 = rotatePoint( b2, radY, Point( 1, 0, 0 ), position ); c2 = rotatePoint( c2, radY, Point( 1, 0, 0 ), position ); d2 = rotatePoint( d2, radY, Point( 1, 0, 0 ), position ); float radZ = rad.get_z(); a1 = rotatePoint( a1, radZ, Point( 0, 0, 1 ), position ); b1 = rotatePoint( b1, radZ, Point( 0, 0, 1 ), position ); c1 = rotatePoint( c1, radZ, Point( 0, 0, 1 ), position ); d1 = rotatePoint( d1, radZ, Point( 0, 0, 1 ), position ); a2 = rotatePoint( a2, radZ, Point( 0, 0, 1 ), position ); b2 = rotatePoint( b2, radZ, Point( 0, 0, 1 ), position ); c2 = rotatePoint( c2, radZ, Point( 0, 0, 1 ), position ); d2 = rotatePoint( d2, radZ, Point( 0, 0, 1 ), position ); } ale spróbowałem połączyć allegro z openGl i odkryłem że działa urzycie glEnable(GL_DEPTH_TEST); glCullFace(GL_BACK); przy okazji zmieniłem kod wyświetlania na kod openGl |
|
pekfos |
» 2024-08-25 20:12:45 Czyli problem rozwiązany? Bo jak nie, to podaj kod który składa się w jakąś logiczną całość. |
|
« 1 » |