Realistisches Laufen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Fuchsi

Betreff: Realistisches Laufen

BeitragSa, März 04, 2006 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin bei meinem First-Person Rollenspiel schon ziemlich weit. Auch das
Laufen, Treppensteigen, Springen usw. Klappt alles super.
Jetzt wollte ich aber einbauen, dass sich die Kamera so bewegt, als ob
man richig laufen würde. Also auf und ab, oder so ähnlich.
Weiß wer von euch wie das geht ?

Gruß Fuchsi !

5k41

BeitragSa, März 04, 2006 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
vielleicht:
Code: [AUSKLAPPEN]

if switch=0 then
 moveentity cam,0,.1,0:switch=1
else
 moveentity cam,0,-.1,0:switch=0
endif

sowas könnte man dann auch noch mit Turnentity machen...
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

HW

BeitragSa, März 04, 2006 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Sowas ginge mit einer Sinusfunktion und TranslateEntity o.Ä.
Also ungefähr so:
Code: [AUSKLAPPEN]
sinusvariable=sinusvariable+1
TranslateEntity camera,0,sin(sinusvariable),0

Eventuell muss man den Sinuswert verkleinern, um eine allzu schwankende Bewegung zu vermeiden.
Also "sin(sinusvariable)" durch "sin(sinusvariable)/Korrekturwert" ersetzen.

Fuchsi

BeitragSa, März 04, 2006 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort. Ich hab mal das mit der Sinusvariable probiert, aber da tut sich garnichts.
 

HW

BeitragSa, März 04, 2006 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Nichts? Seltsam. Dann hab ich mich wohl geirrt. Habe es selbst nie ausprobiert.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 04, 2006 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Da tut sich nichts wenn...
...danach wieder PositionEntity benutzt wird.
...die Schwingung zu gering ist. Also nicht genügend multipliziert wird.
...die Zählervariable zu langsam ansteigt und eine Bewegung nicht bewusst wargenommen wird.

Fuchsi

BeitragSo, März 05, 2006 10:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja du hast recht ich positioniere die Camera mit positonentity. Aber
ich mache es so:

Code: [AUSKLAPPEN]

y_dif=sin(sinusvariable)
positionentity cam,entityx(player),entityy(player)+y_dif,entityz(player)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 05, 2006 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du sinusvariable permanent am durchzählen? Wenn ja, versuche mal y_dif mit einem zusätzlichen Multiplikator zu addieren um eine mögliche Bewegung sichtbar zu machen...
 

HW

BeitragSo, März 05, 2006 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Was hectic damit meint: Irgendwo in der Hauptschleife müsste der Code sinusvariable=sinusvariable+irgendwas stehen. Sollte das der Fall sein, solltest du den Sinus der Sinusvariable noch multiplizieren. Der unmultiplizierte Sinus schwankt ja nur zwischen 1 und -1, daher könnte es erforderlich sein, ihn zu multiplizieren. Kommt ganz auf den Maßstab an, den du verwendest.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 05, 2006 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähhh, ja, da fällt mir noch was ein... Ein normaler Mensch macht so etwa 2-3 Schritte pro Sekunde. Demnach sollte bei ~60FPS sinusvariable=sinusvariable+'''in etwa bei'''12 bis 18 sein. Ausserdem gibt es ein Unterschied zwischen MoveEntity und PositionEntity. Genau diesen Unterschied machst du bei PositionEntity durch deine Berechnung EntityY(player)+y_dif wieder zu nichte... Unter anderem kann auch das der Grund sein, warum keine Bewegung in der Richtung zu stande kommt. Da eine Gravitation jede Bewegung wieder nach unten zieht. Man, schwer zu erklären... Rolling Eyes Du machst eventuell eine Bewegung die durch eine Gravitationsberechnung wieder geglättet wird... Kann das sein? Hast du mal ein wenig mehr Codeschnippsel?

Fuchsi

BeitragSo, März 05, 2006 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Drehung und Positionierung der Camera und des Players:

Code: [AUSKLAPPEN]


Function turning()      
   y_dif=sin(sinusvariable)
      PositionEntity cam,EntityX(player),EntityY(player)+y_dif,EntityZ(player)
   RotateEntity player,0,EntityYaw(player)-MouseXSpeed()*0.2,0
   RotateEntity cam,EntityPitch(cam)+MouseYSpeed()*0.2,EntityYaw(player),0
   If EntityPitch(cam) > 85 Then
   RotateEntity cam,85,0,0
   EndIf
   MoveMouse 400,300
End Function



Gravitation :

Code: [AUSKLAPPEN]

Function gravy()      
   TranslateEntity player,0,-0.2,0
   If EntityCollided(player_dummy,2) = False Then
   TranslateEntity player,0,player_grav#,0
   EndIf
End Function

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 05, 2006 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist sinusvariable auch Global?

Und hier das Problem was ich vorhin befürhtet habe... Nach einer Sinusgangbewegung wird durch die Gravitation diese wieder geglättet... Das Problem ist, das alles mit relativen Berechnungen gemacht wird... Versuche mal zu testzwecken erst die gravy() -Funktion und dann die turning() -Funktion aufzurufen... Und verstärke mal die Sinusbewegung mit beispielsweise erstmal um das Zehnfache ...EntityY(player)+y_dif*10... und zusätzlich ...y_dif=sin(sinusvariable*30)....

Auch wenn die Werte übertrieben sein werden, helfen sie der Fehlersuche enorm...

Hier noch etwas...Code: [AUSKLAPPEN]
...
   RotateEntity cam,EntityPitch(cam)+MouseYSpeed()*0.2,EntityYaw(player),0
   If EntityPitch(cam) > 85 Then
      RotateEntity cam,85,0,0
   EndIf
...

Wenn Kameraneigung zu groß wird, wird auch Y und Z auf Null gesetzt! Soll das so sein?

Fuchsi

BeitragSo, März 05, 2006 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, eigentlich nich. Danke für die Tipps. Very Happy
Wenn ich y_dif mit 30 multipliziere dann wird nur die Kamera nur höher hinauf versetzt, und sie bewegt sich nich auch und ab.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group