Hallo M-vier-sterm-eins-nd. Ich will mal versuchen, ein bisschen Licht ins Dunkel zu bringen. Was ich jetzt schreibe gilt erstmal nur für C-Skript, weil ich jetzt einfach rate, dass du eben das benutzt.
Doch bevor ich loslege: Eigentlich finde ich nicht, dass deine Antwort eine ausführlichere Erläuterung verdient. Insofern schreibe ich das hier also auch für andere Nutzer, die den Thread vielleicht finden. Aber mal schauen, vielleicht wirst du ja demnächst etwas höflicher.

Siehe auch: http://www.coniserver.net/ubb7/ubbthreads.php?ubb=showflat&Number=47414&page=1

Zuerst einmal: Dein Problem ist wirklich absolut neu. Eine 3rd-Person-Kamera? Hatte noch nie jemand vor dir, hatten wir sicher noch nie im Forum. Also würde eine Suche im Forum sicher gar nichts bringen, sofern hast du also schonmal alles richtig gemacht.

Auf die Gefahr hin, dass ich jetzt einen weiteren ähnlichen beitrag wie deinen letzten provoziere ("man alter was solln das weiß ich alles"), schauen wir uns doch mal deinen Code an!

Code:
ACTION Mbewegen
{
player = me;

WHILE (1)
{
WHILE (1)
{
c_move (me, nullvector, vector(mouse_force.x * movespeed * time_step,0, mouse_force.y * movespeed * time_step), GLIDE);

vec_to_angle(CAMERA.PAN,me);
wait(1);
}
wait(1);
}
}


Ich habe mal vec_to_angel durch den weniger spannenden Befehl "vec_to_angle" ersetzt, d.h. bei mir gehts um die langweiligen Winkel - kennst du vielleicht aus dem Matheunterricht - und nicht um Engel, obwohl mir göttlicher Beistand auch ganz Recht wäre.

Also gut! Nachdem du den Player-pointer gesetzt hast, geht es gleich in eine While-schleife!

While-schleifen führen den Code innerhalb der geschwieften Klammern ("{", "}") aus, bis die Bedingung in den runden Klammern ("(", ")") falsch ist, d.h. "0" zurückliefert. Ist das ganze hingegen wahr, so wird ein Wert != (lies: ungleich) 0 zurückgeliefert, bei C-Script in der Regel "1".

Wahre Bedingungen sind z.B. "3==3", "34>2" und "1". Nanu, warum auch das letzte? Das ist ja keine Bedingung?
Schön, dass du gefragt hast! Ja, wie vorhin gesagt, liefern wahre Bedingungen "1" zurück - und "1" liefert eben auch "1" zurück, aber von mir aus, ganz streng genommen ist das vielleicht keine Bedingung. Okay! Was passiert denn in dieser WHILE-Schleife?

"WHILE (1)". Wie, nochmal? Einmal reicht dir nicht? Tatsächlich macht das keinen Sinn (hier, zumindest). Der Code wird ZEILE FÜR ZEILE abgearbeitet (Kommt die Engine beim "}" deiner Schleife an, wird die Bedingung überprüft und dann wird je nachdem zum Anfang der Schleife, oder aber zur nächsten Zeile gesprungen). Geh also ruhig mal deinen Code so Zeile für Zeile durch, dann erkennst du, dass die zweite While-schleife keinen Sinn macht.


Nein, wirklich, mach das Mal. Ich warte so lange.

Nun mach schon! Ich meine das ernst.


So. Entferne also eines der beiden WHILE(1)-Konstrukte. Die erste Zeile in deiner Schleife ist eine c_move-Geschichte. Weißt du, was toll daran ist? C_move wird z.T. mit Vektoren aufgerufen. Weißt du, was ein vektor ist?
Ich rate mal: Nein.

Dabei ist es doch ganz einfach! Ein Vektor ist ein Element eines Vektorraumes.
Wo wir das jetzt geklärt haben...

... oh, moment, das ist nicht ganz verständlich? Na gut, machen wir es anschaulicher. Gleichzeitig ziehen wir uns damit den Hass aller Mathematiker zu, aber was solls. Ein Vektor kannst du dir als einen Pfeil vorstellen.

Was braucht man, um den Pfeil eindeutig zu definieren? Mal dir mal auf ein Blatt Papier dein Koordinatensystem und überlege: Wieviele Werte musst du mir mindestens geben, damit ich am Ende den gleichen (zweidimensionalen) Pfeil gemalt habe, wie du?

MACH ES, HIMMEL.
- Überlege wirklich mal, das wird dir helfen, es zu verstehen. Und nicht die Lösung lesen!

Wenn du vier gesagt hast...
- Dann meinst du vermutlich, dass ich sowohl die Start- als auch die Zielposition benötige (oder evtl. gibst du statt Zielposition Winkel und Länge an, aber davon gehe ich jetzt mal nicht aus). Gut gedacht! Das können wir aber auch noch mit weniger Zahlen machen, indem wir uns auf die gleiche Startposition einigen. Sagen wir einfach: Ab sofort geht jeder Pfeil vom Ursprung aus. Die Pfeile sind gleich, wenn sie die GLEICHE RICHTUNG und die GLEICHE LÄNGE haben. Okay?
Wenn du zwei gesagt hast...
- Herzlichen Glückwunsch! Lies trotzdem, was ich oben geschrieben habe
Wenn du weniger als zwei angegeben hast
- Dann überlege nochmal genauer! Bist du sicher, dass alle Informationen, die du gegeben hast, ausreichen? Kann man sie nicht "mißverstehen"?
Wenn du mehr als vier gesagt hast
- Überlege dir Möglichkeiten, auf einzelne dieser Werte zu verzichten, oder evtl. mehrere Werte durch nur einen auszudrücken. Ehrlich gesagt, wüßte ich gerade nicht, warum du mehrere Werte brauchst.

Analog dazu braucht man im dreidimensionalen drei Werte. (Und nun rate, wieviele im vierdimensionalen).

Bei dem C_move geben diese Pfeile an, in welche Richtung die zu bewegende Entity bewegt werden soll. Dabei sind zwei Werte anzugeben, "relvec" und "absvec". "relvec" wird dabei zuvor noch um die Winkel der Entity gedreht. Ein Beispielbild:



Bei "absvec" wird der Schritt des rotierens jedoch nicht durchgeführt.

Öffne ruhig mal Wed und platziere irgendeine Entity (bei der du die Winkel erkennen kannst, zur Not nimm Warlock) in dein Level. Drehe sie um 180°.

Der Code

Code:
c_move(UNSEREWARLOCKENTITY,nullvector,vector(50,0,0),null);


Bewegt den Warlock um 50 Quants auf der X-Achse, d.h. in WEDs Top-View nach RECHTS. Das tut er auch immer, egal, wie der Warlock gerade rotiert ist.

Dieser Code hingegen:

c_move(UNSEREWARLOCKENTITY,vector(50,0,0),nullvector,null);

bewegt den warlock 50 Quants IN SEINER BLICKRICHTUNG. Also bei Rotation um 180° nach LINKS. Veränderst du noch munter den Tilt-wert, kann sich Warlock so sogar nach oben bewegen.

Verstehst du jetzt den Unterschied? Stelle dir den 50|0|0-Vektor als Pfeil von Warlock ausgehend vor, einmal als abvec (nicht rotiert), und einmal als relvec.

Um aus so einem Absvec "per Hand" einen relvec zu machen, kannst du den befehl "vec_rotate" benutzen:

vec_rotate(absvec,warlock.pan); //jetzt hat "absvec" die Koordinaten eines relvecs (heißt aber noch "absvec")


Vom vorherigen Beitrag ausgehend rollst du jetzt die Augen und beginnst zu tippen, aber nein! Das alles hilft dir, dein Problem zu erreichen.

Lesen wir uns nochmal deinen Beitrag durch:

Quote:
ich möchte das sich die kamera per tastendruck um die entity drumherum bewegt in einem bestimmten abstandt.

also quasi um den punkt dreht wo die entity ist


Obwohl du dir alle Mühe gegeben hast, glaube ich trotzdem, den Beitrag zu verstehen. Du willst die Kamera um die Entity drehen.



Wir suchen eine Möglichkeit, den rosa Pfeil zu berechnen. Hm... wie du siehst, könnten wir das erreichen, indem wir die beiden orangenen Pfeile verfolgen - wir addieren die beiden und erreichen damit den rosa Pfeil. Das sowas geht, ist die Magie der Vektoren.

Nun dann! Der erste orangene Pfeil ist der vom Nullvector zur Entityposition. Im Code sieht das nicht schwieriger aus:

entity.x

oder für deine action gleich

my.x

Tadah! Das ist der erste (im Bild längere) orangene Pfeil. Doch wie berechnet man den zweiten?

Dazu musst du erkennen, dass dieser Pfeil von der Kameraorientierung abhängt - d.h. von ihren pan/tilt-Werten.

In diesem Bild kannst du dich davon überzeugen:



Der zweite, kleinere orangene Vektor zeigt immer in die Richtung, in die die Kamera NICHT schaut. Das können wir mit unserem Vec_rotate-Wissen leicht in Code umsetzen:

Code:
vec_set(camera.x,vector(-50,0,0));
vec_rotate(camera.x,camera.pan);


Es ist MINUS 50, weil es ja genau in der anderen Richtung ist, nicht in der, in die die Kamera schaut. Die 50 ist die Länge des Vektor, d.h. der Abstand der Kamera von der Entity.

Schließlich müssen wir noch den größeren orangenen Vektor dazu addieren, d.h. die Position der Entity:

Code:
vec_add(camera.x,my.x); //oder entity.x mit dem entsprechenden pointer, hier zb player.x



Um wirklich zu rotieren, musst du die pan-werte der Kamera verändern, statt deiner vec_to_angle-zeile kannst du dann ein

Code:

camera.pan +=key_force.x*2*time_step;



einfügen, oder so etwas in der Art.





So. Jetzt habe ich mal eine Bitte. Könnten wir, bittebitte, mal irgendeinen Thread, in dem Vektoren erläutert werden - es gibt ja mittlerweile zahlreiche - als Sticky anpinnen? Schließlich sind Vektoren ja wirklich eine sehr zentrale Sache, und je eher man die versteht, umso besser. smile


Perhaps this post will get me points for originality at least.

Check out Dungeon Deities! It's amazing and will make you happy, successful and almost certainly more attractive! It might be true!