Ich habe für mein aktuelles Projekt eine solche Kamera gebraucht und aus Faulheit hier im Forum gesucht, aber nichts gefunden... daher musste ich dann doch selber ran.
Und da dachte ich mir "Vielleicht kann das ja noch jemand gebrauchen..."

Die Kamera folgt dem Spieler und zoomt rein, wenn die Map dazwischen ist (der Teil könnte sicherlich verbessert werden...). Die Blickrichtung wird mit der Maus gesteuert, wobei beim nach oben/unten gucken neben dem Winkel auch die Höhe mit verändert wird.
Ist sicherlich nicht perfekt oder kompliziert, aber vielleicht kann das ja trotzdem jemand gebrauchen

Diese 2 Zeilen in den Spieler-Code einfügen:
ent_create(NULL, my.x, camera_helper_back);
ent_create(NULL, my.x, camera_helper_front);
Und hier der Kamera-Code selber (das Modell hierfür war 240 Quants groß, ihr müsst also evtl. an den Zahlen ein bisschen herumspielen):
////////////////////////
var dist_norm = 500; //normale Distanz zwischen Spieler und Kamera
var dist_real = 500; //aktuelle Distanz zwischen Spieler und Kamera
////////////////////////
var dist_helper = 100; //Distanz der Dummys zum Spieler
////////////////////////
var smooth_cam = 0.5; //Glättungsfaktor
////////////////////////
ENTITY* ent_helper_front;
ENTITY* ent_helper_back;
function camera_helper_front()
{
var you_handle = handle(you);
ent_helper_front = my;
while(1)
{
proc_mode = PROC_LATE;
you = ptr_for_handle(you_handle);
my.x = you.x + dist_helper * cos(you.pan);
my.y = you.y + dist_helper * sin(you.pan);
my.z += mouse_force.y*30;
my.z = minv(my.z, you.z+200); //obere Grenze, etwas über dem Kopf
my.z = maxv(my.z, you.z-120); //untere Grenze, in diesem Fall bei den Füßen
wait(1);
}
}
function camera_helper_back()
{
var you_handle = handle(you);
ent_helper_back = my;
while(1)
{
proc_mode = PROC_LATE;
you = ptr_for_handle(you_handle);
my.x = you.x - dist_helper * cos(you.pan);
my.y = you.y - dist_helper * sin(you.pan);
my.z -= mouse_force.y*30;
my.z = minv(my.z, you.z+200); //obere Grenze
my.z = maxv(my.z, you.z-120); //untere Grenze
wait(1);
}
}
function camera_()
{
var temp[3];
///Kameraposition und -winkel:////////////////////
camera.x = my.x - dist_real * cos(my.pan);
camera.y = my.y - dist_real * sin(my.pan);
camera.z = 180 + ent_helper_back.z; //die 180 ist variabel
vec_set(temp, ent_helper_front.x);
vec_sub(temp, camera.x);
vec_to_angle(camera.pan, temp);
///Zoom bei Hindernissen://///////////////////////////
c_trace(my.x, camera.x, IGNORE_ME | IGNORE_PASSABLE | IGNORE_MODELS | IGNORE_SPRITES);
if(result != 0)
{
dist_real = result-10;
smooth(dist_real, smooth_cam);
}else
{
dist_real = dist_norm;
smooth(dist_real, smooth_cam);
}
}
Zur Erklärung: das Ganze basiert auf zwei Dummy-Entities, wovon sich eine vor und eine hinter dem Spieler befindet. Sie bewegen sich entgegensetzt (gesteuert durch mouse_force.y) zueinander und treffen sich am Nullpunkt des Spielers. Die Kamerahöhe wird immer auf die Höhe der hinteren Entity gesetzt (+ einen festen Wert, um zu verhindern, dass die Kamera bspw. ganz am Boden liegt) und dann wird sie auf die vordere ausgerichtet. Wenn also die hintere Entity gerade oben ist, guckt die Kamera zur anderen nach unten und andersherum.
Um den Winkel zu verändern, einfach mit dist_helper herumspielen; ein größerer Wert sollte für einen flacheren Winkel sorgen und umgekehrt natürlich ein kleinerer für einen steileren.
Das war's auch schon

Bei Fragen einfach fragen

Gruß