Skocz do zawartości
kamikos

Symulacja Sprężyny W Opengl

Rekomendowane odpowiedzi

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

}

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...