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ść
DejaVu
» 2023-07-31 00:10:00
A czy ChatGPT rozwiązuje Twój problem?
Oczywiście! Poniżej przedstawiam pełną implementację, która wykorzystuje podane wcześniej zmiany w kodzie. Zakładam, że mamy odpowiednie deklaracje i definicje zmiennych użytych w kodzie.

c
Copy code
C/C++
// Wykonaj rotację wokół osi Z
for( trit * t = mesh; t != NULL; t = t->next )
{
   
// Oblicz anglez, len1, len2, len3 (jak w istniejącym kodzie)
   
    // Wykonaj rotację wokół osi Z
   
float fullAnglez1 =( deg1z + anglez ) * toRads;
   
float fullAnglez2 =( deg2z + anglez ) * toRads;
   
float 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;
}

// Wykonaj rotację wokół osi Y
for( trit * t = mesh; t != NULL; t = t->next )
{
   
// Oblicz angley, len1, len2, len3 (jak w istniejącym kodzie)
   
    // Wykonaj rotację wokół osi Y
   
float fullAngley1 =( deg1y + angley ) * toRads;
   
float fullAngley2 =( deg2y + angley ) * toRads;
   
float 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 );
}

// Wykonaj rotację wokół osi X
for( trit * t = mesh; t != NULL; t = t->next )
{
   
// Oblicz anglex, len1, len2, len3 (jak w istniejącym kodzie)
   
    // Wykonaj rotację wokół osi X
   
float fullAnglex1 =( deg1x + anglex ) * toRads;
   
float fullAnglex2 =( deg2x + anglex ) * toRads;
   
float 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 );
}

// Oblicz pozycję środka trójkąta (CENTER)
for( trit * t = mesh; t != NULL; t = t->next )
{
   
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;
   
   
// 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 (projection 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;
}
Wprowadziłem zmiany w kodzie, aby rotacje były stosowane pojedynczo, a każda z nich przekształcała model na podstawie jego oryginalnych pozycji. Teraz możesz wywołać te pętle rotacji kilka razy, jedna za drugą, aby uzyskać pożądane efekty kombinacji rotacji w przestrzeni 3D.
P-180195
tBane
Temat założony przez niniejszego użytkownika
» 2023-07-31 00:11:58
Ponieważ 3x przechodziłbym tę samą pętle, a to że mam 3x tyle zmiennych to mały koszt. Punkt to także kolejna klasa czyli klasa +3 odniesienia do zmiennych.. Wolę jednak prędkość :-)
Silnik nie ma być złożony, tu są zwykle płaskie trójkąty ew. Kolorowanie, z deseniem lub tekstura płaska. Niepotrzebny mi jest ani vector ani struct ani klasa dla vektorow bo to opóźnia mój algorytm.

Nie rozumiem, gdzie jest błąd. Rotacje y i x stworzyłem w oparciu o rotacje z. Wziąłem do ręki trzy długopisy i obracalem je o 90 stopni. Tak wyznaczylem równania arctan2 oraz sin coś. I pojedynczo to działa a sumarycznie nie, a powinno

P-180196
pekfos
» 2023-07-31 00:18:39
Niepotrzebny mi jest ani vector ani struct ani klasa dla vektorow bo to opóźnia mój algorytm.
Co? Podaj pomiary wydajności.

C/C++
t->r1x = t->r1x - len1 * cos( fullAngley1 );
t->r1y = t->r1y;
t->r1z = t->r1z + len1 * sin( fullAngley1 );
Przesuniecie nie powinno być względem centrum?

I pojedynczo to działa a sumarycznie nie, a powinno
Z ciekawości, jak testowałeś to pojedynczo, gdy nie masz ich wydzielonych?
P-180197
tBane
Temat założony przez niniejszego użytkownika
» 2023-07-31 00:28:39
Dobra.. Bo ja nic nie rozumiem..
Jest przesuniecie od centrum ale tylko dla pierwszej rotacji tzn dla osi Z, tam pobieram wartości oryginalnych wierzchołków do rotownych, a w rotacji y,x rekalkuluje na nowo rotowane wierzcholki. W moim programie będę zawsze robił rotacje (x,y,z) dla każdego elementu który jest zmieniany w danej pętli programu.

 aby przetestować pojedynczo rotacje należy dwie pozostałe zakomentowc a zmienne "r" zastąpić "v" ( w degx,degy,degz,len1,len2,len3 ) i uruchomic

A testowałem tak, że stworzyłem po kolei osobne programowy bawiąc się 3 dlugopisami, skoroszytem i dość efektywnie klawiatura - aż zadziałało :D

Taki mam teraz kod.. i po pełnym obrocie mój sześcian zamienia sie w punktowy obiekty a potem wychodzi z czwartego wymiaru :D


C/C++
for( trit * t = mesh; t != NULL; t = t->next )
{
   
   
// 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;
   
   
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 ) );
   
   
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->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;
   
   
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 ) );
   
   
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 );
   
/*
  // 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;
   
     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) );
     
      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 );  
  */
   
    // 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;
   
P-180200
tBane
Temat założony przez niniejszego użytkownika
» 2023-07-31 00:42:06
 Oto specjalnie dla Ciebie wydzielona działająca rotacja Y (polecam rzut 3->2D

C/C++
// 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;

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 ) );

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

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

t->r3x = cx - len3 * cos( fullAngley3 );
t->r3y = t->v3y;
t->r3z = cz + len3 * sin( fullAngley3 );
P-180202
pekfos
» 2023-07-31 00:42:12
Może lepiej nazwijmy rzeczy.. Robisz konwersję punktu x,y,z z układu współrzędnych kartezjańskich do układu współrzędnych polarnych. Modyfikujesz kąt obrotu i robisz konwersję w drugą stronę.
https://en.wikipedia.org/wiki/Polar_coordinate_system
C/C++
t->r1x = t->r1x - len1 * cos( fullAngley1 );
W konwersji odwrotnej używasz tu t->r1x, gdzie powinno być centrum układu.

Znając nazwę tego co wymyśliłeś, może są jakieś fajne wzory które uproszczą sprawę? :)
P-180203
tBane
Temat założony przez niniejszego użytkownika
» 2023-07-31 00:46:57
Ale punkt centralny modelu się nie zmienia. Model ma rotowac wokół swojego centrum - bo o to mi chodzi. Myślałem by dodawać wektor przesunięcia po rotacji X

X = cx + rotZ + rotY + rotX
Y = cy + rotZ + rotY + rotX
Z = cx + rotZ + rotY + rotX
 


No coś w ten deseń robię co przesłałeś
P-180204
pekfos
» 2023-07-31 00:49:12
No i ma się nie zmieniać. Oczekiwałbym że ta linia wyglądałaby tak
C/C++
t->r1x = cx - len1 * cos( fullAngley1 );
P-180205
1 « 2 » 3 4 5 6 7 8
Poprzednia strona Strona 2 z 8 Następna strona