Skocz do zawartości

GM'owe "bounce" w C++


Marcin1147

Rekomendowane odpowiedzi

Hej, mam taki kod:

void Odbij()    //Funkcja odbijania piłki
{
    randomize();    //Losowość
    int from=20;    //Ustaw zakres
    rands=random(from*2)-from;    //Losuj losową liczbę w przedziale od -20 do 20
    ball->direction+=180+(ball->direction*2)+rands;    //Odbijanie z losowym współczynnikiem
}

Problem mam z tą funkcją ponieważ nie zawsze działa jak należy, "świruje" itd.

Zmienna ball->direction i ball->speed działają tak ja w GM (mój patent) ale coś napisanie odpowiednika dla GM'owego "bounce" mi nie wychodzi :sp_ike:

Odnośnik do komentarza
Udostępnij na innych stronach

GMowe bounce dziala na zasadzie kolizji masek. sprawdza ksztalt i na jego podstawie wylicza wektor normalny i wektor odbicia. a ze Ty masz obiekty jako kulki to latwo znajdziesz wektor normalny (jest on przedluzeniem promienia, przecinajacym sie z punktem gdzie nastapila kolizja na okregu kulki), wzor na wektor odbicia znajdziesz w sieci, nawet chyba pod pierwszym linkiem w googlach :)

 

(mój patent)

sprowadzę Cię na ziemię i powiem - nie ;p

Odnośnik do komentarza
Udostępnij na innych stronach

no wlasnie nie jest to takie jak oczekiwales :P

Odnośnik do komentarza
Udostępnij na innych stronach

A odbijanie się od powierzchni płaskiej tzn. leci na ścianę pod kątem 45, odbija się i odlatuje od ściany pod kątem 135? :P

 

E: Jeżeli to jednak niemożliwe poprosiłbym cię o podanie tego wektora odbicia bo w googlach jakoś nic nie mogę znaleźć: http://www.google.pl/search?q=wektor+odbicia

Odnośnik do komentarza
Udostępnij na innych stronach

R=I-2N(dot(N,I));

N-normalna

I-promień padania

 

Mój błąd, żadnego L tam nie ma.

 

vec3 reflect(vec3 I,vec3 N)//wektor n powinien być znormlizowany

{

return I-2.0f*N*dot(N,I);

{

 

float dot(vec3 v1,vec3 v2)

{

return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z;

}

Odnośnik do komentarza
Udostępnij na innych stronach

to mnoz tylko 2 pierwsze: X i Y, Z w tym przypadku bedzie zawsze rowne 0

 

float dot(vec2 v1,vec2 v2)

{

return v1.x*v2.x+v1.y*v2.y

};

Odnośnik do komentarza
Udostępnij na innych stronach

sam mozesz je sobie zrobic. Korzysci z obiektowosci.

 

struct vec2

{

float x;

float y;

};

Odnośnik do komentarza
Udostępnij na innych stronach

generalnie kierunki lepiej trzymac w wektorach.

zawsze konwertuj kierunki obrotu na wektory za pomoca lengthdirs.

 

vec2 kierunek;

kierunek.x=lengthdir_x(direction,1);

kierunek.y=lengthdir_y(direction,1);

Odnośnik do komentarza
Udostępnij na innych stronach

Czekaj, uaktualnie mój cudowny kod:

struct vec2
{
float x;
float y;
};

vec2 reflect(vec2 I,vec2 N)
{
return I-2.0f*N*dot(N,I);
{

float dot(vec2 v1,vec2 v2)
{
return v1.x*v2.x+v1.y*v2.y;
}

void Odbij()  
{
vec2 kierunek,nowy;
kierunek.x=lengthdir_x(ball->direction,1);
kierunek.y=lengthdir_y(ball->direction,1);
nowy=reflect(12,kierunek);
i_co_teraz();
}

Odnośnik do komentarza
Udostępnij na innych stronach

musisz jeszcze zrobic przeciazenie operatora mnozenia dla vec2 (przy okazji reszte tez)

 

vec2& operator* (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x*v2.x;
temp.y=v1.y*v2.y;
return(temp);
};

vec2& operator/ (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x/v2.x;
temp.y=v1.y/v2.y;
return(temp);
};

vec2& operator+ (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x+v2.x;
temp.y=v1.y+v2.y;
return(temp);
};

vec2& operator- (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x-v2.x;
temp.y=v1.y-v2.y;
return(temp);
};

Odnośnik do komentarza
Udostępnij na innych stronach

point_direction() musisz sobie napisac. na forum nie raz byl poruszany o tym watek z tego co wiem

Odnośnik do komentarza
Udostępnij na innych stronach

struct vec2
{
float x;
float y;
};

//pomijam operatory

vec2 reflect(vec2 I,vec2 N)
{
return I-2.0f*N*dot(N,I);
{

float dot(vec2 v1,vec2 v2)
{
return v1.x*v2.x+v1.y*v2.y;
}

int point_direction(int x1, int x2, int y1, int y2)
{
atan2(y2-y1,x2-x1) * 180 / M_PI; //korzystam z math.h
}

void Odbij()  
{
vec2 kierunek,nowy;
kierunek.x=lengthdir_x(ball->direction,1);
kierunek.y=lengthdir_y(ball->direction,1);
nowy=reflect(12,kierunek);
ball->direction=point_direction(nowy.x,nowy.y, -co tutaj-, -co tutaj-);
}

A co z x2, y2 :(

Odnośnik do komentarza
Udostępnij na innych stronach

ball->direction=point_direction(0,0,nowy.x,nowy.y);

 

bo wektor kierunku to tylko kierunek, bez pozycji poczatkowej, a raczej pozycja ta lezy na [0,0]

Odnośnik do komentarza
Udostępnij na innych stronach

zapomnialem jeszcze o operatorach dla vec2 z liczbami bez ktorych nie zadziala funkcja reflect:

 

vec2& operator* (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x*v2;
temp.y=v1.y*v2;
return(temp);
};


vec2& operator/ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x/v2;
temp.y=v1.y/v2;
return(temp);
};


vec2& operator+ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x+v2;
temp.y=v1.y+v2;
return(temp);
};


vec2& operator- (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x-v2;
temp.y=v1.y-v2;
return(temp);
};

Odnośnik do komentarza
Udostępnij na innych stronach

to jak zwraca "vec2&" zamien na "vec2" bez "&"

Odnośnik do komentarza
Udostępnij na innych stronach

float lengthdir_x(float len,float dir)
{
return(cos(degtorad(dir))*len)
};

float lengthdir_y(float len,float dir)
{
return(sin(degtorad(dir))*len)
};

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, mam takie coś:

//
//Początek GMCLAN'owego syfa
//
struct vec2
{
float x;
float y;
};

vec2 operator* (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x*v2;
temp.y=v1.y*v2;
return(temp);
};

vec2 operator/ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x/v2;
temp.y=v1.y/v2;
return(temp);
};

vec2 operator+ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x+v2;
temp.y=v1.y+v2;
return(temp);
};

vec2 operator- (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x-v2;
temp.y=v1.y-v2;
return(temp);
};

float dot(vec2 v1,vec2 v2)
{
return v1.x*v2.x+v1.y*v2.y;
}

vec2 reflect(vec2 I,vec2 N)
{
return I-2.0f*N*dot(N,I);
}

int point_direction(int x1, int x2, int y1, int y2)
{
return(atan2(y2-y1,x2-x1) * 180 / M_PI);
}

double degtorad( double alfa) { return alfa * M_PI / 180; }

float lengthdir_x(float len,float dir)
{
return(cos(degtorad(dir))*len);
}

float lengthdir_y(float len,float dir)
{
return(sin(degtorad(dir))*len);
}

void Odbij()
{

vec2 srodek;
srodek.x=12;
srodek.y=12;

vec2 kierunek,nowy;
kierunek.x=lengthdir_x(ball->direction,1);
kierunek.y=lengthdir_y(ball->direction,1);
nowy=reflect(srodek,kierunek);
ball->direction=point_direction(0,0,nowy.x,nowy.y);
}
//
//Koniec GMCLAN'owego syfa
//

 

I wywala: Illegal structure operation tutaj:

vec2 reflect(vec2 I,vec2 N)

{

return I-2.0f*N*dot(N,I);

}

Odnośnik do komentarza
Udostępnij na innych stronach

bo mususz miec operatory vec2<->float oraz vec2<->vec2, a ty masz tylko te pierwsze. zapomnaiels o drugich, dla tego nie moze wykonac dzialan wektora z wektorem.

Odnośnik do komentarza
Udostępnij na innych stronach

//
//Początek GMCLAN'owego syfa
//
struct vec2
{
float x;
float y;
};

//Operatory wektor<->float
vec2 operator* (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x*v2;
temp.y=v1.y*v2;
return(temp);
};

vec2 operator/ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x/v2;
temp.y=v1.y/v2;
return(temp);
};

vec2 operator+ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x+v2;
temp.y=v1.y+v2;
return(temp);
};

vec2 operator- (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x-v2;
temp.y=v1.y-v2;
return(temp);
};
//Operatory wektor<->float

//Operatory wektor<->wektor
vec2 operator* (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x*v2.x;
temp.y=v1.y*v2.y;
return(temp);
};

vec2 operator/ (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x/v2.x;
temp.y=v1.y/v2.y;
return(temp);
};

vec2 operator+ (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x+v2.x;
temp.y=v1.y+v2.y;
return(temp);
};

vec2 operator- (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x-v2.x;
temp.y=v1.y-v2.y;
return(temp);
};
//Operatory wektor<->wektor

float dot(vec2 v1,vec2 v2)
{
return v1.x*v2.x+v1.y*v2.y;
}

vec2 reflect(vec2 I,vec2 N)
{
return I-2.0f*N*dot(N,I);
}

int point_direction(int x1, int x2, int y1, int y2)
{
return(atan2(y2-y1,x2-x1) * 180 / M_PI);
}

double degtorad( double alfa) { return alfa * M_PI / 180; }

float lengthdir_x(float len,float dir)
{
return(cos(degtorad(dir))*len);
}

float lengthdir_y(float len,float dir)
{
return(sin(degtorad(dir))*len);
}

void Odbij()
{

vec2 srodek;
srodek.x=12;
srodek.y=12;

vec2 kierunek,nowy;
kierunek.x=lengthdir_x(ball->direction,1);
kierunek.y=lengthdir_y(ball->direction,1);
nowy=reflect(srodek,kierunek);
ball->direction=point_direction(0,0,nowy.x,nowy.y);
}
//
//Koniec GMCLAN'owego syfa
//

Ten sam error!

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...