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 for( trit * t = mesh; t != NULL; t = t->next ) { 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; }
for( trit * t = mesh; t != NULL; t = t->next ) { 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 ); }
for( trit * t = mesh; t != NULL; t = t->next ) { 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 ); }
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; t->p1x = t->r1x; t->p1y = t->r1y; t->p2x = t->r2x; t->p2y = t->r2y; t->p3x = t->r3x; t->p3y = t->r3y; }
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. |
|
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
|
|
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. 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? |
|
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 for( trit * t = mesh; t != NULL; t = t->next ) { 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; 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 ); t->p1x = t->r1x; t->p1y = t->r1y; t->p2x = t->r2x; t->p2y = t->r2y; t->p3x = t->r3x; t->p3y = t->r3y; |
|
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->2Ddeg1y = 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 );
|
|
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_systemt->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ę? :) |
|
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ś |
|
pekfos |
» 2023-07-31 00:49:12 No i ma się nie zmieniać. Oczekiwałbym że ta linia wyglądałaby tak t->r1x = cx - len1 * cos( fullAngley1 );
|
|
1 « 2 » 3 4 5 6 7 8 |