Warsztat.GD

Programowanie => Silniki => Wątek zaczęty przez: xardas97260 w Wrzesień 25, 2010, 12:00:35

Tytuł: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 12:00:35
Witam. Postanowiłem że jednak wykorzystam bullet'a. Wersja testowa mojej gry będzie bazować na VehicleDemo z bullet'a. I teraz mam takie pytania:
1. Zauważyłem pewien problem, jak macie to demko, to odpalcie je, i zobaczcie jak skręcają się koła przednie - Jak    widać po pierwsze, jak puścimy klawisz, nie wracają na pierwotną pozycję, a jeśli już skręcimy koło, i chcemy jeszcze raz je skręcić, to jakby rusza się może z milimetr, zacina się na jakąś sekundę, i przekręca dopiero. Jak to wyeliminować?
2. A teraz takie lamerskie pytanie, wynikające z tego, że nigdy nie kodziłem na jakimś silniku (tak naprawdę to ja tą grę miałem praktycznie zrobiną, tyle że na c# i XNA, ale uznałem że ją wywale, i napiszę od początku, ale w czymś z prawdziwego zdarzenia - tak padł wybór na c++ i bullet'a). A co do pytania, to jakie formaty modeli obsługuje bullet? (w xna było prościej, poprostu dawało się plik .fbx i po problemie). I teraz właściwie nie wiem, czy pytanie powinien zadać jakie formaty modeli obsługuje bullet, czy -||- obsługuje OpenGL - bo to jest silnik renderujący.
Dzięki za odp, i wybaczcie że pisze wątek za wątkiem ; )
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: Avaj w Wrzesień 25, 2010, 12:03:01
Bullet jest silnikiem fizyki, go nie obchodzą twoje modele, masz mu dać najwyżej jakąś paczkę trójkątów, bounding boxy i macierze, ale rysujesz sobie sam.
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 12:05:47
No, czyli ze moję wątpliwości się sprawdziły. Jakie formaty obsługuje opengl, to już sam wyczytam. Więc, pozostało tylko 1 pytanie
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: djsmtih w Wrzesień 25, 2010, 12:06:36
Nie chce Cie martwić ale po twoich tematach obawiam sie ,że porywasz się z motyką na słońce :)
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 12:08:46
Wiem że to tak wygląda, ale uwierzcie nie. C++ cały czas się uczę, a co do ogólnie programowania, to mam doświadczenie. Nie że programuję od 12 lat, ale od tych 2. Poprostu to tak dlatego wygląda, bo nigdy nie robiłem nic na żadnym silniku tego typu. A co z pierwszym pytaniem :P ?
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: Dab w Wrzesień 25, 2010, 12:26:21
Jakie formaty obsługuje opengl, to już sam wyczytam.

Daj znać, jak coś znajdziesz. :D (podpowiem: obsługuje format ZTT -- zupa z trójkątów :) )
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 12:29:19
Ja będę używał obj loader'a. (Wiem ze to nie wchodzi w skład opengl'a)
Edit: Naprawde nikt nie zna odpowiedzi na moje 1 pytanie?
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: .:NOXY:. w Wrzesień 25, 2010, 12:35:00
Oj no pewnie dlatego ze na szytwno jest zmiana kata skrecania z jakims clampingiem :) i pewnie jako ze jest sztywny kat skrecania to nie idzie to po DT a jak nie idzie po DeltaTime to sie moga takie cuda dziac :)

Wklej tu kawalek kodu odpowiedzialny za ustalanie kata skrecania kola i ew jego apply w to kolo :) zobacze kod powiem ci co jest nie halo :p
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 12:39:24
Kod ma 627 lini, więc daj mi z 10 minut. Jak znajde to przedytuje ten post
switch (key)
    {
    case GLUT_KEY_LEFT :
{
gVehicleSteering += steeringIncrement;
if ( gVehicleSteering > steeringClamp)
gVehicleSteering = steeringClamp;

break;
}
    case GLUT_KEY_RIGHT :
{
gVehicleSteering -= steeringIncrement;
if ( gVehicleSteering < -steeringClamp)
gVehicleSteering = -steeringClamp;

break;
Natomiast tutaj ponizej parametry kół i kilku innych rzeczy:
float gVehicleSteering = 0.f;
float steeringIncrement = 0.04f;
float steeringClamp = 0.3f;
float wheelRadius = 0.7f;
float wheelWidth = 0.4f;
float wheelFriction = 1000;//BT_LARGE_FLOAT;
float suspensionStiffness = 20.f;
float suspensionDamping = 2.3f;
float suspensionCompression = 4.4f;
float rollInfluence = 0.1f;//1.0f;
I kolejny kawałek kodu:
#ifdef FORCE_ZAXIS_UP
int rightIndex = 0;
int upIndex = 2;
int forwardIndex = 1;
btVector3 wheelDirectionCS0(0,0,-1);
btVector3 wheelAxleCS(1,0,0);
#else
int rightIndex = 0;
int upIndex = 1;
int forwardIndex = 2;
btVector3 wheelDirectionCS0(0,-1,0);
btVector3 wheelAxleCS(-1,0,0);
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: .:NOXY:. w Wrzesień 25, 2010, 13:07:41
no ok rzuca sie delta :) a raczje jej brak jeszcze jak bys dal kod kotry ten angle zamienia na cos przysfajalnego dla samego kola ;)
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 15:20:10
Więc jak zmodyfikować kod, aby nie występował problem z pytania 1?
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: .:NOXY:. w Wrzesień 25, 2010, 16:01:06
no ale pokaz mi jeszcze ten kawalek kodu gdzie ten kat jest zameniany nie wiem na radiany dla skretu macierz obrotu? xD moze tam jest juz delta etc ;)
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 16:04:35
Wiesz, tak będzie prościej - cały kod:
http://wklej.org/id/393253/
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: .:NOXY:. w Wrzesień 25, 2010, 16:07:36
Ok mam. Ciało tych funkcji poprosze:

wheelIndex = 0;
m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex);
wheelIndex = 1;
m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex);
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 16:10:32
Dobra, wkelej na wklej wszystkie pliki jakie są w tym projekcie:
VehicleDemo.h: http://wklej.org/id/393264/
Main.cpp: http://wklej.org/id/393265/
I to wszystko. Pozostałe pliki to albo nagłówki bullet'a, albo pliki .cpp bullet'a
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: .:NOXY:. w Wrzesień 25, 2010, 16:21:46
btRaycastVehicle*   m_vehicle; ok wychodzi na to ze jest to class z bulleta chyba ze sie myle to mnie poprawcie w takim razie najpawdopodobniej wina braku delty; ale wez sie upewnij czy to nie jest jakas klasa stowrzona z interfejsu :)
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 16:24:02
Nie, nie jest zrobiona z interfacu, więc, 3 prośby:
1. Wytłumacz mi co to jest to Delta
2. Jak to działa
3. Jak to zmodyfikować kod, żeby działało
Wielkie THX z góry
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: Xirdus w Wrzesień 25, 2010, 16:51:47
1. delta time to różnica między czasem (tzn. momentami w czasie) renderowania dwóch klatek.
2. Im większa delta time, tym dłuższe są ruchy (np. jeśli prędkość to 1m/s, a dt=30ms, to ruch w danej klatce to 3cm, a jak dt=40ms, to przy tej samej prędkości ruch jest 4cm - powoduje to, że niezależnie od FPSów, ruch jest zawsze 1m w każdej sekundzie).
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 17:10:54
Ok. Ale to pomoże z tym, że koła wolno skręcają. A co z tym, że koła nie wracają to pierwotnej pozycji? A co do DT, to możesz mi pomóc dodać dt do tego demka?
EDIT. Co do tego że koła nie wracają do pierwotnej pozycji, to coś takiego trzaba by było zastosować
If (lewa strzałka.niewciśnięta)
   Koło.LewePrzednie.Obrót = 0 //lub -||- = domyślna.pozycja
   Koło.PrawePrzednie.Obrót = 0 //lub -||- = domyślna.pozycja


Oczywiście nie patrzcie na to że jest źle to up - teraz trzeba przetłumaczyć to na c++
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: Xirdus w Wrzesień 25, 2010, 18:29:26
Nie, nie zeruj kół (tak po prostu). Zrób coś takiego:
if (lewaStrzalka.wcisnieta)
{
    kolo.obrot -= Obrot;
    if (kolo.obrot <= 0 - MaxObrot) kolo.obrot = 0 - MaxObrot;
}
if (prawaStrzalka.wcisnieta)
{
    kolo.obrot += Obrot;
    if (kolo.obrot >= MaxObrot) kolo.obrot = MaxObrot;
}
if (!lewaStrzalka.wcisnieta && !prawaStrzalka.wcisnieta)
{
    if (kolo.obrot < 0)
    {
        if (kolo.obrot + Obrot / 2 > 0) kolo.obrot = 0;
        else kolo.obrot += Obrot / 2;
    }
    if (kolo.obrot > 0)
    {
        if (kolo.obrot - Obrot / 2 < 0) kolo.obrot = 0;
        else kolo.obrot -= Obrot / 2;
    }
}
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 18:35:06
Aha. No to nad tym posiedzę, i napiszę co mi wyszło ;)
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 18:48:36
Nie idzie mi.. zawsze kompilator wywala błąd. Czy możesz to napisać w c++? Bardzo Cię proszę
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: Xirdus w Wrzesień 25, 2010, 18:52:30
...to było C++. Z tym, że Strzalka.wcisnieta, kolo.obrot, Obrot i MaxObrot to były słowa zastępcze dla odpowiednio: sprawdzenie klawisza, aktualny obrót koła, jednostkowy obrót koła i maksymalny obrót koła. Taki ogólny kod, który musisz przerobić i wstawić w odpowiednie miejsce. Jak to zrobić to ci nie powiem, bo po pierwsze nie znam się na Bullecie, a po drugie to twój kod :) .
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: xardas97260 w Wrzesień 25, 2010, 19:03:10
No tak... dobrze, ja na dzisaj ide już od pc, ale jeszcze nad tym pomyślę, jutro napiszę co mi wyszło
Tytuł: Odp: Robienie gry na demku z Bullet'a
Wiadomość wysłana przez: .:NOXY:. w Wrzesień 26, 2010, 12:40:15
Ja bym to zrobil tak wtedy kola sie prostuja automatycznie ;) i plynnie wg delty

Kod: (cpp) [Zaznacz]
if (steering > 0) {
_steeringWheelState -= abs(steering) * delta;
} else if(steering < 0){
_steeringWheelState += abs(steering) * delta;
}
else if( steering == 0){
_steeringWheelState -= sign(_steeringWheelState) * delta;
  if( fabs( _steeringWheelState ) < 0.06 )
_steeringWheelState = 0;
}

_steeringWheelState = clamp(_steeringWheelState, _steeringMaxAngleRad, -_steeringMaxAngleRad);



gdzie steering ustawiam w KeyDown i jest albo -1 albo 1 :)