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

[C++] TritEngine - Silnik Graficzny z wykorzystaniem matematyki niższej ( czyli jak ominąć macierze )

Ostatnio zmodyfikowano 2023-11-22 15:17
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
» 2023-07-31 00:52:07
A co w przypadku gdy dam 2 rotacje jednocześnie?
rotZ = 1.f;
rotY = 0.5f;

I znów nie będzie działać, bo albo wykonam rotacje dla Z albo dla Y. Albo jednocześnie i jedna z nich zastąpi druga. Nieee... Tu trzeba inaczej to wykombinować. Choć na mój prosty rozum to co pisałem było logiczne :-/
P-180206
pekfos
» 2023-07-31 00:54:44
Przeczytaj uważnie to co pisałem o konwersjach układów współrzędnych. Wynik poprzedniej transformacji jest zawarty w kątach. Centrum jest stałe i len też powinno być stałe, chociaż pewnie nie jest przez błędy numeryczne.
P-180207
tBane
Temat założony przez niniejszego użytkownika
» 2023-07-31 01:05:17
Nie rozumiem.. Zrobiłem jak doradziles, by len się nie zmieniało ( w sumie to masz rację). Rotacja już tak bardzo bardzo się nie wykrzacza, ale.. Cube się powiększa i pomniejsza oraz deformuje w jednej osii tzn. Robi się dość mocno prostokątny x1.5 - Panie, romb mi się robi :D

C/C++
len1 = sqrt( pow( cx - t->v1x, 2 ) + pow( cy - t->v1y, 2 ) + pow( cz - t->v1z, 2 ) );
len2 = sqrt( pow( cx - t->v2x, 2 ) + pow( cy - t->v2y, 2 ) + pow( cz - t->v2z, 2 ) );
len3 = sqrt( pow( cx - t->v3x, 2 ) + pow( cy - t->v3y, 2 ) + pow( cz - t->v3z, 2 ) );

// ROTATE Z ( adding vector of movement z )
deg1z = atan2( cy - t->v1y, cx - t->v1x ) * toDegrees;
deg2z = atan2( cy - t->v2y, cx - t->v2x ) * toDegrees;
deg3z = atan2( cy - t->v3y, cx - t->v3x ) * toDegrees;

fullAnglez1 =( deg1z + anglez ) * toRads;
fullAnglez2 =( deg2z + anglez ) * toRads;
fullAnglez3 =( deg3z + anglez ) * toRads;

t->r1x = cx + len1 * sin( fullAnglez1 );
t->r1y = cy + len1 * cos( fullAnglez1 );
t->r1z = t->v1z;

t->r2x = cx + len2 * sin( fullAnglez2 );
t->r2y = cy + len2 * cos( fullAnglez2 );
t->r2z = t->v2z;

t->r3x = cx + len3 * sin( fullAnglez3 );
t->r3y = cy + len3 * cos( fullAnglez3 );
t->r3z = t->v3z;

// ROTATE Y ( adding vector of movement y )
deg1y = atan2( cz - t->v1z, cx - t->v1x ) * toDegrees;
deg2y = atan2( cz - t->v2z, cx - t->v2x ) * toDegrees;
deg3y = atan2( cz - t->v3z, cx - t->v3x ) * toDegrees;

fullAngley1 =( deg1y + angley ) * toRads;
fullAngley2 =( deg2y + angley ) * toRads;
fullAngley3 =( deg3y + angley ) * toRads;

t->r1x = t->r1x - len1 * cos( fullAngley1 );
t->r1y = t->r1y;
t->r1z = t->r1z + len1 * sin( fullAngley1 );

t->r2x = t->r2x - len2 * cos( fullAngley2 );
t->r2y = t->r2y;
t->r2z = t->r2z + len2 * sin( fullAngley2 );

t->r3x = t->r3x - len3 * cos( fullAngley3 );
t->r3y = t->r3y;
t->r3z = t->r3z + len3 * sin( fullAngley3 );
P-180208
pekfos
» 2023-07-31 01:11:26
Dalej jest
C/C++
t->r1x = t->r1x - len1 * cos( fullAngley1 );
No i liczenie deg1y itd powinno być względem wyniku poprzedniej transformacji.
P-180209
tBane
Temat założony przez niniejszego użytkownika
» 2023-07-31 01:29:01
No.. Nie wiem czy o to tobie chodziło, ale zrobiłem osobno wszystkie rotacje co by się nie pogubić. Nie rozumiem gdzia mam błąd w obliczeniach.

C/C++
void model::rotatez()
{
   
for( trit * t = mesh; t != NULL; t = t->next )
   
{
       
len1 = sqrt( pow( cx - t->v1x, 2 ) + pow( cy - t->v1y, 2 ) + pow( cz - t->v1z, 2 ) );
       
len2 = sqrt( pow( cx - t->v2x, 2 ) + pow( cy - t->v2y, 2 ) + pow( cz - t->v2z, 2 ) );
       
len3 = sqrt( pow( cx - t->v3x, 2 ) + pow( cy - t->v3y, 2 ) + pow( cz - t->v3z, 2 ) );
       
       
// ROTATE Z ( adding vector of movement z )
       
deg1z = atan2( cy - t->v1y, cx - t->v1x ) * toDegrees;
       
deg2z = atan2( cy - t->v2y, cx - t->v2x ) * toDegrees;
       
deg3z = atan2( cy - t->v3y, cx - t->v3x ) * toDegrees;
       
       
fullAnglez1 =( deg1z + anglez ) * toRads;
       
fullAnglez2 =( deg2z + anglez ) * toRads;
       
fullAnglez3 =( deg3z + anglez ) * toRads;
       
       
t->r1x = cx + len1 * sin( fullAnglez1 );
       
t->r1y = cy + len1 * cos( fullAnglez1 );
       
t->r1z = t->v1z;
       
       
t->r2x = cx + len2 * sin( fullAnglez2 );
       
t->r2y = cy + len2 * cos( fullAnglez2 );
       
t->r2z = t->v2z;
       
       
t->r3x = cx + len3 * sin( fullAnglez3 );
       
t->r3y = cy + len3 * cos( fullAnglez3 );
       
t->r3z = t->v3z;
   
}
}

void model::rotatey()
{
   
for( trit * t = mesh; t != NULL; t = t->next )
   
{
       
len1 = sqrt( pow( cx - t->r1x, 2 ) + pow( cy - t->r1y, 2 ) + pow( cz - t->r1z, 2 ) );
       
len2 = sqrt( pow( cx - t->r2x, 2 ) + pow( cy - t->r2y, 2 ) + pow( cz - t->r2z, 2 ) );
       
len3 = sqrt( pow( cx - t->r3x, 2 ) + pow( cy - t->r3y, 2 ) + pow( cz - t->r3z, 2 ) );
       
       
// ROTATE Y ( adding vector of movement y )
       
deg1y = atan2( cz - t->r1z, cx - t->r1x ) * toDegrees;
       
deg2y = atan2( cz - t->r2z, cx - t->r2x ) * toDegrees;
       
deg3y = atan2( cz - t->r3z, cx - t->r3x ) * toDegrees;
       
       
fullAngley1 =( deg1y + angley ) * toRads;
       
fullAngley2 =( deg2y + angley ) * toRads;
       
fullAngley3 =( deg3y + angley ) * toRads;
       
       
t->r1x = t->r1x - len1 * cos( fullAngley1 ) / 2.f;
       
t->r1y = t->r1y;
       
t->r1z = t->r1z + len1 * sin( fullAngley1 );
       
       
t->r2x = t->r2x - len2 * cos( fullAngley2 ) / 2.f;
       
t->r2y = t->r2y;
       
t->r2z = t->r2z + len2 * sin( fullAngley2 );
       
       
t->r3x = t->r3x - len3 * cos( fullAngley3 ) / 2.f;
       
t->r3y = t->r3y;
       
t->r3z = t->r3z + len3 * sin( fullAngley3 );
   
}
}

void model::rotatex()
{
   
for( trit * t = mesh; t != NULL; t = t->next )
   
{
       
len1 = sqrt( pow( cx - t->r1x, 2 ) + pow( cy - t->r1y, 2 ) + pow( cz - t->r1z, 2 ) );
       
len2 = sqrt( pow( cx - t->r2x, 2 ) + pow( cy - t->r2y, 2 ) + pow( cz - t->r2z, 2 ) );
       
len3 = sqrt( pow( cx - t->r3x, 2 ) + pow( cy - t->r3y, 2 ) + pow( cz - t->r3z, 2 ) );
       
       
// ROTATE X ( adding vector of movement x )
       
deg1x = atan2( cy - t->r1y, cz - t->r1z ) * toDegrees;
       
deg2x = atan2( cy - t->r2y, cz - t->r2z ) * toDegrees;
       
deg3x = atan2( cy - t->r3y, cz - t->r3z ) * toDegrees;
       
       
fullAnglex1 =( deg1x + anglex ) * toRads;
       
fullAnglex2 =( deg2x + anglex ) * toRads;
       
fullAnglex3 =( deg3x + anglex ) * toRads;
       
       
t->r1x = t->r1x;
       
t->r1y = t->r1y + len1 * sin( fullAnglex1 );
       
t->r1z = t->r1z + len1 * cos( fullAnglex1 );
       
       
t->r2x = t->r2x;
       
t->r2y = t->r2y + len2 * sin( fullAnglex2 );
       
t->r2z = t->r2z + len2 * cos( fullAnglex2 );
       
       
t->r3x = t->r3x;
       
t->r3y = t->r3y + len3 * sin( fullAnglex3 );
       
t->r3z = t->r3z + len3 * cos( fullAnglex3 );
   
}
}

void model::projection()
{
   
for( trit * t = mesh; t != NULL; t = t->next )
   
{
       
// PROJECTION 3D
       
t->p1x = t->r1x; t->p1y = t->r1y;
       
t->p2x = t->r2x; t->p2y = t->r2y;
       
t->p3x = t->r3x; t->p3y = t->r3y;
       
       
/*
  // PROJECTION 3D->2D ( procjection 3 to 2D ) ( for tests the model )
   t->p1x = t->r1x + t->r1z/dz; t->p1y = t->r1y + t->r1z/dz;
   t->p2x = t->r2x + t->r2z/dz; t->p2y = t->r2y + t->r2z/dz;
   t->p3x = t->r3x + t->r3z/dz; t->p3y = t->r3y + t->r3z/dz;
  */
   
}
}

void model::calcCenterOfTriangles()
{
   
for( trit * t = mesh; t != NULL; t = t->next )
   
{
       
// POSITION OF TRIANGLE ( CENTER )
       
t->cx =( t->r1x + t->r2x + t->r3x ) / 3.f;
       
t->cy =( t->r1y + t->r2y + t->r3y ) / 3.f;
       
t->cz =( t->r1z + t->r2z + t->r3z ) / 3.f;
   
}
}

void model::calculate()
{
   
// atan2( x2-x1, y2-y1 ); - funkcja zwraca kat miedzy dwoma punktmi (x1,y1), (x2,y2)  
   
    // ROTATIONS OF VERTICES
   
rotatez();
   
rotatey();
   
rotatex();
   
projection();
   
calcCenterOfTriangles();
   
}
P-180210
tBane
Temat założony przez niniejszego użytkownika
» 2023-08-01 20:39:07
Wy pewnie też nie macie pomysłu jak z tego zrobić dobrą rotacje (x, y, x) :P
P-180211
pekfos
» 2023-08-01 22:15:08
Mógłbym wskazać ten sam kawałek kodu już chyba piąty raz, ale zostańmy przy tym że po to robisz po swojemu by nie było łatwo. Może narysuj na kartce geometryczną interpretację tego co robisz w tym nieszczęsnym fragmencie? Zawsze możesz po prostu użyć macierzy obrotu. No i wydajność będzie większa.
P-180216
tBane
Temat założony przez niniejszego użytkownika
» 2023-08-01 22:38:01
No właśnie wszystko mam wyrysowane na kartkach, 3 dlugopisami symulowalem osie z,x,y i rotowalem nimi w dłoni. No i wyszły mi takie równania. Nie mam pojęcia dlaczego to nie działa, jak bym zrozumiał gdzie leży błąd mojego mało logicznego myślenia.. Zrozumiałbym 3D a to byłby niezły LVL UP. Mhm.. Najwyżej odpuszczę na jakiś czas. Bo mi te równania nie działają nawet jeśli pracuję na już rotowanych wierzchołkach. Rozciąga mi się bryła x2 w osi x chociażby. Jakby czegoś w równania Ch brakowało jakiegoś jeszcze mnożnika.
P-180217
1 2 « 3 » 4 5 6 7 8
Poprzednia strona Strona 3 z 8 Następna strona