kamikos Opublikowano 19 Czerwca 2005 Zgłoś Opublikowano 19 Czerwca 2005 witam potrzebuje w openglu zasymulowac ruch sprezyny. Znalazlem w necie kod, lecz niestety za bardzo nie moge go rozgryzc. Prosilbym o jakies drobne komentarze do tego kodu. Nie umiescilem ponizej calego kodu, tylko czesc odpowiadajaca za ruch sprezyny oraz zadeklorowane zmienne. Ne wiem np. skad sie wziela wartosc i za co odpowiada float t_fact, float u_fact, float dt, float du. z gory dziekuje za pomoc. zmienne: float pi = 3.1415926535897932384626433; float height = 0.5; float heightStep = 0.01; int sign = 1; int pointsNum = 200; float t_fact = 8.399; float u_fact = 2; float dt = t_fact*pi/48; float du = u_fact*pi/12; float param = 3; ruch sprezyny: for(t=0; t<t_fact*pi; t+=dt) { for(u=0; u<u_fact*pi; u+=du) { glColor3f(1, 1, 1); glBegin(GL_QUADS); x = cos(t)*(param+cos(u)); y = sin(t)*(param+cos(u)); z = height*(t)+sin(u); xs = cos(t)*(param); ys = sin(t)*(param); zs = height*(t); i = x - xs; j = y - ys; k = z - zs; glTexCoord2f(0.0, 0.0); glNormal3f(i, j, k); glVertex3f(x, y, z); x = cos(t+dt)*(param+cos(u)); y = sin(t+dt)*(param+cos(u)); z = height*(t+dt)+sin(u); xs = cos(t+dt)*(param); ys = sin(t+dt)*(param); zs = height*(t+dt); i = x - xs; j = y - ys; k = z - zs; glTexCoord2f(0.0, 1.0); glNormal3f(i, j, k); glVertex3f(x, y, z); x = cos(t+dt)*(param+cos(u+du)); y = sin(t+dt)*(param+cos(u+du)); z = height*(t+dt)+sin(u+du); xs = cos(t+dt)*(param); ys = sin(t+dt)*(param); zs = height*(t+dt); i = x - xs; j = y - ys; k = z - zs; glTexCoord2f(1.0, 1.0); glNormal3f(i, j, k); glVertex3f(x, y, z); x = cos(t)*(param+cos(u+du)); y = sin(t)*(param+cos(u+du)); z = height*(t)+sin(u+du); xs = cos(t)*(param); ys = sin(t)*(param); zs = height*(t); i = x - xs; j = y - ys; k = z - zs; glTexCoord2f(1.0, 0.0); glNormal3f(i, j, k); glVertex3f(x, y, z); glEnd(); } } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 21 Czerwca 2005 Zgłoś Opublikowano 21 Czerwca 2005 (edytowane) nie wiem co dokłądnei chcesz uzyskac.. ale wystarczy użyc funkcji sinus z argumentem inkrementowanym przy każdej klatce i wymnozyć to przez jakąś wartość.. aby ruch był widoczny (wartość sinusa od -1..1) Może nie będzie to idealny ruch sprężyny, ale wygglądać będzie podobnie... Jesli dodatkowo chciałbyś aby były to drgania gasnące wysatrczy zmniejszać współczynnik stojący przed sinusem z każdym krokiem pętli renderującej aż do 0. float x,A=20,xPos;render(){ xPos=A*sin(x); x+=1.0f; if(A>0) A-=0.01f; renderObject()}robiłem coś podobnego na laborce z grafiki komputerowej z openGLa.. do prostych zastosowań wystarczy. Oczywiscie jeśli ruch ma się odbywać w 3 płaszczyznach to należy zwielokrotnić zmienne i/lub użyć odpowiednio przseskalowanej zmiennej xPos do 'sterowania' ruchem po osiach y i z. Edytowane 21 Czerwca 2005 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...