Kameraflug

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

 

tmode00

Betreff: Kameraflug

BeitragDo, Apr 15, 2010 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich möchte euch auf diesem Wege ein kleines Script mit auf den Weg geben, mit dem Ihr einen Kameraflug in ein 3d-Spiel einbauen könnt.

1. Ein paar Konstanten deklarieren

Code: [AUSKLAPPEN]
Const record_mode = 0
Const max_frames = 6000
;0 = Playmodus
;1 = Aufnahmemodus


2. Kamera erstellen:

Code: [AUSKLAPPEN]
;camera
Global camera = CreateCamera()
MoveEntity(camera,0,0,-3)


3. Das Tcamani - Type speichert einzelne Framedaten (also Kamera x,y,z und die Drehung)


Code: [AUSKLAPPEN]
Type Tcamani
   Field x#,y#,z#,pitch#,yaw#,roll#
End Type
Global camani.Tcamani


4. Die Aufnahmefunktion

Wichtig: Für eine Aufnahme muss vor dem Start der Aufnahmemodus record_mode auf 1 gestellt werden. Damit ist das Programm für diesen einen Start auf Aufnahme gestellt.

Bitte im Ordner der Programm .bb - Datei bzw. Exe einen Unterordner Media erstellen.

Code: [AUSKLAPPEN]

Global record_frames
Function record_cam()
   If (record_mode = 1)
      If (record_frames = 0) Then
         record_frames = 1
      ElseIf (record_frames < max_frames) Then
         If (KeyDown(45)) Then
            record_frames = record_frames + 1
            camani.Tcamani = New Tcamani
            camani\x# = EntityX(camera)
            camani\y# = EntityY(camera)
            camani\z# = EntityZ(camera)
            camani\pitch# = EntityPitch(camera)
            camani\yaw# = EntityYaw(camera)
            camani\roll# = EntityRoll(camera)
         EndIf
      EndIf
      
      ;save type
      If (KeyHit(47)) Then
         camfile = WriteFile(".\media\cam.ttl")
         For camani.Tcamani = Each Tcamani
            WriteString(camfile,Str(camani\x#))
            WriteString(camfile,Str(camani\y#))
            WriteString(camfile,Str(camani\z#))
            WriteString(camfile,Str(camani\pitch))
            WriteString(camfile,Str(camani\yaw))
            WriteString(camfile,Str(camani\roll))
         Next
         CloseFile(camfile)
         End
      EndIf
   EndIf
End Function


5. Einlesen der cam.ttl (der im .\Media Ordner nach einer Aufnahme gespeicherten Kamerafahrtdatei)

Code: [AUSKLAPPEN]
Function read_cam_intro()
   If (record_mode = 0) Then
      Local camfile = ReadFile(".\media\cam.ttl")
      While Not Eof(camfile)
         record_frames = record_frames + 1
         camani.Tcamani = New Tcamani
         camani\x# = Float(ReadString(camfile))
         camani\y# = Float(ReadString(camfile))
         camani\z# = Float(ReadString(camfile))
         camani\pitch = Float(ReadString(camfile))
         camani\yaw = Float(ReadString(camfile))
         camani\roll = Float(ReadString(camfile))
      Wend
      CloseFile(camfile)
   EndIf
End Function


6. Die Abspielfunktion


Code: [AUSKLAPPEN]

Global play_frames = 0;-1 schalten intro ab
Function play_cam()
   If (record_mode = 0) Then
      If (play_frames = 0) Then
         camani.Tcamani = First Tcamani
         play_frames = 1
      Else   
         If (play_frames < max_frames-1)
            play_frames = play_frames + 1
            camani = After camani
         Else
            play_frames = 0
            Return
         EndIf
      EndIf
      
      
      PositionEntity(camera,camani\x# ,camani\y#,camani\z#)
      RotateEntity(camera,camani\pitch,camani\yaw,camani\roll)   
   EndIf
End Function


6. Generelles Kamera-Movement mit Pfeiltasten, Punkt, Komma, PgUp, PgDown, Pos1, Ende

Code: [AUSKLAPPEN]
Function movecam()
   If KeyDown(200) Then MoveEntity camera,0,0,.07;nach z+
   If KeyDown(208) Then MoveEntity camera,0,0,-.07;nach z-
   If KeyDown(201) Then TurnEntity camera,-.4,0,0;pgup
   If KeyDown(209) Then TurnEntity camera,.4,0,0;pgdown
   If KeyDown(203) Then TurnEntity camera,0,.4,0;links
   If KeyDown(205) Then TurnEntity camera,0,-.4,0;rechts
   If KeyDown(199) Then MoveEntity camera,0,.07,0;hoch
   If KeyDown(207) Then MoveEntity camera,0,-.07,0;runtedr
   If KeyDown(51) Then MoveEntity camera,-.07,0,0;X-links
   If KeyDown(52) Then MoveEntity camera,.07,0,0;X-rechts
End Function


7. Programmstart -^ Alles obendrüber sind nur die notwendigen Funktionen

Code: [AUSKLAPPEN]
If (record_mode = 0) Then read_cam_intro()
While Not KeyHit(1)   
   movecam()   
   record_cam()
   play_cam()   
   RenderWorld()
   UpdateWorld()
   Text 1,1,record_frames
   Flip
Wend


Wie gehe ich zum Aufnehmen vor?
Nachdem das Script fertig ist kann die Aufnahme beginnen. Dazu einfach den Record_mode auf 1 setzen, die maximale Anzahl Frames (Standart 6000) setzen, starten.

+ Das Spiel startet
+ Kameratestflug mit den Pfeiltasten starten (zb. Ausrichten, von z:50 bis z:-50 fahren)
+ Wenn Flug ok wieder zur Ausgangsposition fahren
+ X drücken (Frames zählen oben links nach oben - solange X gedrückt nimmt es auf)
+ Gleichzeitig mit Pfeiltasten Strecke abfahren
+ X loslassen (CUT)

Nun kann in Ruhe (Aufnahme pausiert, da X nicht mehr gedrückt) zur neuen Position gefahren werden (mit PgUp / Down Kamera drehen, auffahren mit Pos1, abfahren mit Ende -> (wie [wer es kennt] Conitec 3dGs Standartsteurung), Rest mit den Pfeiltasten.

Wenn die neue Position erreicht (z.B. hoch über dem Spiel, Kamera schaut aus Vogelperspektive) kann nun wieder mit den Pfeiltasten ein Testlauf (z.B. nach unten Fliegen) gemacht werden. Dann wieder zurück, X gedrückt halten und wiederholen.

Alle Scenen nun so aufnehmen bis oben 6000 (max_frames) steht und V zum speichern drücken. Anwendung schließt -> cam.ttl im ./media Ordner ist nun erstellt.

Zum Abspielen:
+ Recordmode auf 0 setzen
+ Starten

-> alle Szenen werden nach und nach abgespielt, direkt aneinander gereit. Dadurch entsteht eine Großartige Wirkung.

Hier noch das komplette Script & eine Exe zum anschauen, wie es aussehen kann (minimales Beispiel):

user posted image



Viel Spaß und Liebe Grüße,

Thomas S.

ozzi789

BeitragFr, Apr 16, 2010 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Cool!
Muss ich mir mal genaur anschauen, aber sicherlich praktisch Smile

mfg ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group