Witam, otóż piszę sobie mini-grę zwaną bilardem i mam jeden, jedyny - uciążliwy problem. Wszystko już mam porobione, odbijanie kulek wydaje się być realistyczne - oczywiście polegając na matematyce, trygonometrii. Ok, ale żeby jeszcze bardziej podnieść realistyczność gry bila musi kręcić się wokół własnej osi i tu jest problem. Nie mam pojęcia jak wykonać obrót kulki wokół własnej osi na współrzędnych XY znając kierunek jej przesuwania się w daną stronę (angle). Miałem z dwie koncepcje, lecz w praktyce wyszło to tak, że kulka dostawała herezji :/ Chętnie posłucham waszych koncepcji na wykonanie tenże właśnie obrotu kulki wokół własnej osi i przypominam, ma to odbywać się współrzędnymi XY.
Jak kule nie kręcz i tak na płaskim monitorze będzie wyglądała jak kolo. Co innego gdy na kuli są numerki.
To są kule 3d
Zakładasz ruch z maksymalnym tarciem? Ogólnie to bym w procedurze przesuwu uwzględniał tylko pozycję środka kulki, a wygląd rotacji zrobił na odpowiednim przygotowywaniu jakiegoś sprite'a, modelu itd. W przypadku 2d bym przygotował tablice sprite'ów we wszystkie strony i odpowiednio z rotacji wyliczył który w tym momencie należy wyświetlić. W 3d po prostu wyliczasz rotację modelu.
Jeżeli z kolei chodzi ci o podkręcanie itp. po prostu wprowadziłbym jakiś określony współczynnik tarcia między suknem, a bilą i przechowywałbym rotację bili, z kątem względem powiedzmy osi X i wartością prędkości kątowej. Potem w każdym ticku należy odpowiednio modyfikować tę rotację, prędkość oraz położenie. Następnie metodą prób i błędów znaleźć współczynnik tarcia, który będzie "fajny".
Rotacja jest złożeniem rotacji w jednym kierunku (o wielkości cos a * rot) i w drugim (sin a * rot). Dzięki temu możesz to łatwo złożyć, pamiętając o tym, że rotacja ma być względem środka.
PS2 rot=v/(pid), lub rotx=vx/(pid) i roty=vy/(pi*d)
"rotx=vx/(pid) i roty=vy/(pid)"
Mam pytanie, w twoim wzorze co oznacza symbol v? Z tego co widzę te wzory nie stosują trygonometrii (być może się mylę) i dzięki nim mogę obliczyć rotację względem osi X i Y (na ukos) wykonując te polecenia JEDNOCZEŚNIE na kuli? Dla testów prędkość rotacji kuli XY zrobię stałą. Być może coś nie zrozumiałem z twojego postu, a dla pewności dam prosty przykład na pixelach. Chcąc określić jakąś długość przekątnej na monitorze wykorzystuje sin i cos, dzięki którym po ówczesnym podaniu rotacji daje ukośny wynik. Rysunek z kropek ;D :
Y ^
|
.
.
.
.
.
. x ->
vx - prędkość w kierunku X, vy - prędkość w kierunku Y. Z podzielenia tych prędkości przez obwód otrzymujesz prędkości kątowe: rotx, czyli obrót wokół osi Y i roty, czyli obrót wokół osi X (tak wiem, źle oznaczyłem). Dostajesz wynik w rad/tick, dla irrlichta musisz później jeszcze zamienić na stopnie.
Oczywiście wszędzie zakładam toczenie.
Może prędkości trzeba będzie wziąć z minusem, nie chcę mi się myśleć w którą stronę będzie obracał.
Oraz oczywiście trzeba podzielić tylko przez średnicę, bez pi.
Ok zaraz wypróbuję.
Zaraz, zaraz. Coś mi tu nie pasuje. Kula pod tym wzorem nadal tworzy 'zawijasy'. Ja chciałbym na początek wykonać to bez prędkości, to znacz nie. Tak z prędkością, lecz ze stałą wartością - dla testów (tak aby nie byla zalezna od kierunku). Mi zależy na tym, aby po podaniu kierunku toczenia się kuli toczył się właśnie w tą stronę. Np.
Rotacje kuli:
X:10, Y:5
I po podaniu rotacji (angle) np. 30(stopni) kieruje się lewą stronę bez względu na prędkość.
Trochę o tym poczytałem i okazało się, że byłem kompletnie w błędzie. Wydaje mi się teraz, że najprościej będzie przechowywać dotychczasowy obrót w kwaternionie, jego pomnożenie przez kwaternion wynikający z prędkości kątowej jako wynik da obrót względem początku. Jeżeli programujesz to przy użyciu odpowiedniego silnika to odpowiednie funkcje już powinny tam być (pewnie są też w czystym opengl).