Environmental Camera

Um den Effekt einer Egoansicht zu bekommen, muss die Kamerahöhe jeweils der Umgebungshöhe angepasst werden. Bevor man die Kameraposition des neuen Frames aktualisiert, werden zuerst alle Höhenwerte  die auf der Kameraposition liegen ermittelt.  Dazu wird ein Schnitttest zwischen Objekten und Kameraposition gemacht. Positive Objekte werden in einer Liste gespeichert. Mit der so erstellten Liste wird ein Triangletest durchgeführt. Bei einem Schnitt zwischen Dreieck und Kameraposition lässt sich die genaue höhe im Dreieck ermitteln.  Pro Objekt wird eine Min- und Max- Höhe zurückgegeben. Anschließend vergleicht man die aktuelle Höhe mit den neu ermittelten aus der Liste. Ist eine bestimmte Höhendifferenz überschritten, wird dieses als Hindernis gewertet und die Position der Kamera nicht aktualisiert.

 

  • Alle Objekte finden, die sich mit  CameraPosition schneiden (nur auf XZ-Achse).
  • Die Liste der Objekte einem Dreieckstest auf Geometrieebene unterziehen (Test im ObjectSpace durchlaufen).
  • Bei Erfolgreichen Dreiecktest, pro Objekt die Min- und Max- Höhe zurückgeben und in einer sortierten Liste speichern.
  • die Höhe des letzten Frames mit werten der Höhenliste vergleichen und entscheiden wie und ob die Kameraposition aktualisiert wird.

 


Jump and Fall
Um auf ein Hindernis zu springen oder von einem zu fallen, wird Kraft und Gravitation benötigt. Die Idee dazu ist einfach. Per Eingabe wird eine Sprungkraft gesetzt. Jedes Frame wird diese durch Gravitation reduziert. Der resultierende Wert wird der aktuellen Höhe aufaddiert. Überwiegt die Gravitation, schwenkt  die Aufwärtsbewegung in eine Abwärtsbewegung.

'
Private _JumpVelocity As Single
Private _JumpAirTimeFactor As Single = 0.0018

Const _Gravity As Single = -9.81


'#Basic Idea for Physics: Jump/Fall
'----------------------------------

If Math.Abs(_JumpVelocity) + Math.Abs(CurrentEnv.Ground - _myBaseHeight) > 0 Then

   '# -change Of velocity Is given by gravity and timechange
   '# -change Of trajectory Is given by velocity and timechange
   '# -changes stops if Velocity <= 0 and current Ground is hit.

   _JumpVelocity += CSng(_Gravity * _JumpAirTimeFactor * Frametime)
   _myBaseHeight += CSng(_JumpVelocity * _JumpAirTimeFactor * Frametime)

end if
'

Camera in Action

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s