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

rysowanie czworokątów w Allegro 5

Ostatnio zmodyfikowano 2024-08-25 20:12
Autor Wiadomość
AP1994
Temat założony przez niniejszego użytkownika
rysowanie czworokątów w Allegro 5
» 2024-08-23 20:08:03
   
C/C++
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
P-181514
pekfos
» 2024-08-23 20:14:58
A jak je obracasz?
P-181516
AP1994
Temat założony przez niniejszego użytkownika
» 2024-08-25 17:56:05
Używałem kodu:
C/C++
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 )
{
   
// Rotacja wokół osi x
   
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 );
   
// Rotacja wokół osi y
   
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 );
   
// Rotacja wokół osi z
   
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 );
} //position jest środkiem
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
P-181523
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ść.
P-181525
« 1 »
  Strona 1 z 1