Ein Rundgang durch's Haus

Nun wollte ich einen Film drehen, einen Weg durch das virtuelle Haus. Zunächst mußte ich den Weg definieren. Also wurden zunächst die Wegpunkte festgelegt.

Wegpunkte

Rechts geht's vom Eingang zur Küchentür, in die Küche hinein mit einem Schlenker durch den Raum, danach ins Wohnzimmer und weiter Richtung Flur.

def Rundweg(self):
   eingang_m = (eg_u6+eg_u4)/2
   kuechentuer_m = eg_l6+7+(85/2.0)
   ...
   p = [(eingang_m,eg_l0-500, 150),
        (eingang_m,eg_l0-400, 150),
        (eingang_m,eg_l6, 150),
        (eg_u2,kuechentuer_m, 150),
        ...
Weg der Kamera

Kamera-Geschwindigkeit

Weg der Kamera im EG

Die Wegpunkte bilden die Basis für ein kubisches Spline. Nur hatte ich mit einer direkten Übertragung das Problem, daß die Kamera unterschiedlich schnell war, da z.B. Eingang -> Flur eine wesentlich längere Wegstrecke hatte als Flur -> Küchentür.

Wird von sämtlichen x/y-Koordinaten die jeweilige Entfernung berechnen, diese aufsummiert und danach als Normierung verwendet. Heraus kommen Koordinaten wie diese hier:

#declare WegSpline = spline {
   cubic_spline
   -0.052950 <343,132,-500>,
   0.000000 <343,132,-400>,
   0.377266 <343,132,312>,
   0.430382 <256,132,362>,
   0.479969 <176,132,312>,
   ...
}

Man sieht schön, daß die Punkte etwa gleichweit entfernt sind.

Der Film

Weg der Kamera im OG

Nun wurden die Wegpunkte für EG und OG gesetzt. Anschließend setzt man die Kamera jeweils auf einen vom Spline errechneten Punkt und läßt sie in der x/y-Ebene auf den nächsten Wegpunkt blicken. In der z-Achse (hoch/tief) sollte man das nicht machen, sonst bekommt man im Treppenhaus schlechte Ergebnisse.

camera {
   #declare point1 = <0.0.0>+WegSpline(clock);
   #declare point2 = <0.0.0>+WegSpline(clock+0.02);
   location point1
   look_at < point2.x, point1.y, point2.z>
}

Nun berechnet man 1000 Bilder, indem man Povray mit einer INI-Datei ähnlich wie dieser hier startet:

input_File_Name=haus.pov
Output_File_Type=P
Antialias = off
Jitter = off
Initial_Frame = 1
Final_Frame = 1000
Initial_Clock = 0.0
Final_Clock = 1.0

Und schon hat man die Platte voll (bzw. 1000 pnm-Bilder). Diese kann man mit:

ppmtompeg -no_frame_summary haus.par

und folgender Parameterdatei in einen Film umwandeln:

PATTERN IBBPBBPBBPI
FORCE_ENCODE_LAST_FRAME
OUTPUT haus.mpg
INPUT_DIR .
INPUT
haus*.ppm [0001-1000]
END_INPUT
BASE_FILE_FORMAT PNM
INPUT_CONVERT *
GOP_SIZE 10
PIXEL HALF
IQSCALE 6
PQSCALE 6
BQSCALE 6
RANGE 2
PSEARCH_ALG LOGARITHMIC
SLICES_PER_FRAME 5
BSEARCH_ALG SIMPLE
REFERENCE_FRAME ORIGINAL
ASPECT_RATIO 1.0
FRAME_RATE 23.976
BUFFER_SIZE 20

Download vom Film

Hier ist der Film: haus.mpg.