3D Spieleprogrammierung

Commentaren

Transcriptie

3D Spieleprogrammierung
3D Spieleprogrammierung
Beispiel
Szenengraph
©2008 by Martin Faust
Bewegungen
Was ist falsch am folgenden Modell für einen Ball?
// Update ball
(ball.pos).x += ball.bx;
(ball.pos).y += ball.by;
Gerechnet wird in Pixel
Unabhängig von der Zeit
©2008 by Martin Faust
Bewegliche Elemente
Ein bewegliches Element wird beschrieben durch die Variablen
Vector3 pos
Vector3 dir
float speed
Update geschieht durch
pos += dt * dir * speed;
Abhängig von der Zeit und der Geschwindigkeit
aber dennoch problematisch!
©2008 by Martin Faust
Bewegungen im Spiel
Folgender Code ist falsch
dt = 0.1f;
while (not done) {
pos += dt * dir * speed;
DrawObject();
}
denn, Bewegungen sind abhängig von der Verarbeitungsgeschwindigkeit
“Noch viel zu viele Fehler, aber keine Zeit und Übersicht und Lust mehr sie zu beheben. Ihr solltet übrigens schon ein Pentium 4 2,4Ghz haben... sonst klappt das mit der Kollision nicht so... hey hört auf zu lachen! Wenigstens springt er jetzt auf langsamen Rechnern nicht mehr übers ganze Level... oh mann bin ich deprimiert ;)” [Bull The Frog, CS 1]
©2008 by Martin Faust
Bewegungen im Spiel
Folgender Code ist besser
t1 = Now();
while (not done) {
t0 = t1;
t1 = Now();
dt = t1 ­ t0;
pos += dt * dir * speed;
DrawObject();
}
denn Bewegungen skalieren sich mit der Verarbeitungsgeschwindigkeit
©2008 by Martin Faust
XNA
Macht das Ganze einfach, da bereits in der API vorhanden
protected override void Update(GameTime gameTime) {
float dt = (float) gameTime.ElapsedGameTime.Seconds;
...
}
©2008 by Martin Faust
Beispiel Implementierung
Hashtable
IUpdateable
Entity
+void Update(float dt)
+ Name
+ Bounding
+ Mesh
Terrain
Moveable
+Matrix
+Behaviour
AI
©2008 by Martin Faust
Scene
class Scene : List<Entity> {
public void Render(float dt, Camera camera) {
camera.Apply();
foreach(Entity e in this) {
e.Update(dt);
if (camera.IsVisible(e))
e.Draw();
}
}
public static Scene Load(string level) {
XmlReader reader = ...
}
}
©2008 by Martin Faust
DOOM 3 Beispiel
entityDef amiga_ball {
"spawnclass" "idMoveable"
"model" "models/ball/ball.ase"
"mass" "10"
"density" "0.2"
"friction" "0.1"
"bouncyness" "0"
"snd_bounce" "small_plastic"
"editor_color" "1 1 0"
"editor_mins" "­30 ­30 ­30"
"editor_maxs" "30 30 30"
"editor_rotatable" "1"
"size" "60 60 60"
}
©2008 by Martin Faust