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..." laugh



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 laugh


Diese 2 Zeilen in den Spieler-Code einfügen:
Code:
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):
Code:
////////////////////////
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 laugh Bei Fragen einfach fragen grin

Gruß

Last edited by SQS; 01/01/11 20:26.