Gamestudio Links
Zorro Links
Newest Posts
Zorro 2.70
by jcl. 09/29/25 09:24
optimize global parameters SOLVED
by dBc. 09/27/25 17:07
ZorroGPT
by TipmyPip. 09/27/25 10:05
assetHistory one candle shift
by jcl. 09/21/25 11:36
Plugins update
by Grant. 09/17/25 16:28
AUM Magazine
Latest Screens
Rocker`s Revenge
Stug 3 Stormartillery
Iljuschin 2
Galactic Strike X
Who's Online Now
3 registered members (Ayumi, NewbieZorro, TipmyPip), 13,888 guests, and 6 spiders.
Key: Admin, Global Mod, Mod
Newest Members
krishna, DrissB, James168, Ed_Love, xtns
19168 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Page 1 of 2 1 2
Please Help sicht zur Entity #221410
08/13/08 20:57
08/13/08 20:57
Joined: Jun 2008
Posts: 146
Deutschland
M
M4sterm1nd Offline OP
Member
M4sterm1nd  Offline OP
Member
M

Joined: Jun 2008
Posts: 146
Deutschland
Hallo Leute,

Ich hab n problem. Ich möchte das meine sicht immer zu einer bestimmten Entity dreht. wenn ich sie bewege soll sich die Kamera mitdrehen.

Hier das was ich versucht hab:

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_angel(CAMERA.PAN,me);
wait(1);
}
wait(1);
}
}

Warum geht´s nicht und was kann ich besser machen?

Re: Please Help sicht zur Entity [Re: M4sterm1nd] #221418
08/13/08 22:14
08/13/08 22:14
Joined: May 2005
Posts: 2,713
Lübeck
Slin Offline
Expert
Slin  Offline
Expert

Joined: May 2005
Posts: 2,713
Lübeck
Öhm, weißt du, wie die Vektorstruktur mit der Entitystruktur zusammenhängt?
Also was der Unterschied zwischen my und my.x ist?
Ansonsten steht eigentlich für dein "Problem" der Code schon im Manual... Wenn allerdings obige Grundlage nicht sitzt, wirst du noch einige Probleme haben. Hast du schonmal "per Hand" im Matheunterricht oder so mit Vektoren gerechnet? Oder überhaupt, hast du ein Vorstellung davon, was ein Vektor ist und was dieser ausdrückt? Und entsprechend auch, was genau vec_to_angle macht und weshalb es so nicht funktioniert?

Re: Please Help sicht zur Entity [Re: Slin] #226201
09/08/08 13:51
09/08/08 13:51
Joined: Jun 2008
Posts: 146
Deutschland
M
M4sterm1nd Offline OP
Member
M4sterm1nd  Offline OP
Member
M

Joined: Jun 2008
Posts: 146
Deutschland
man alter du bist ja ne hilfe in dem script oben hab ich nur was vergessen hättest du mir auch sagen können. allerdings hab ich jetzt noch ein anderes problem 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

THX schon mal

Re: Please Help sicht zur Entity [Re: M4sterm1nd] #226228
09/08/08 16:27
09/08/08 16:27
Joined: Jul 2002
Posts: 3,208
Germany
Error014 Offline
Expert
Error014  Offline
Expert

Joined: Jul 2002
Posts: 3,208
Germany
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!
Re: Please Help sicht zur Entity [Re: Error014] #227680
09/15/08 18:03
09/15/08 18:03
Joined: Jun 2008
Posts: 146
Deutschland
M
M4sterm1nd Offline OP
Member
M4sterm1nd  Offline OP
Member
M

Joined: Jun 2008
Posts: 146
Deutschland
Na erstmal ein dickes danke
ja dieser beitrag hat mir sehr weitergeholfen.

Für meinen umgangston im oberen beitrag möchte ich mich entschuldigen aber du musst mir wirklich zu stimmen das die antwort die ich vorher bekahm nicht sehr hilfreich war.
Irgendwie hat der nur drauf abgeziehlt mir zu sagen wie dumm ich bin und nix erklärt. War halt auch etwas gereizt in dem moment. Sorry nochmal.

kann man das eigentlich dann auch so machen das die kamera nicht in einen block(der Wand) verschwindet?
Ja na klar bestimmt und wie?

Last edited by M4sterm1nd; 09/15/08 18:08.
Re: Please Help sicht zur Entity [Re: M4sterm1nd] #227823
09/16/08 10:13
09/16/08 10:13
Joined: Jul 2002
Posts: 3,208
Germany
Error014 Offline
Expert
Error014  Offline
Expert

Joined: Jul 2002
Posts: 3,208
Germany
Quote:
aber du musst mir wirklich zu stimmen das die antwort die ich vorher bekahm nicht sehr hilfreich war.
Irgendwie hat der nur drauf abgeziehlt mir zu sagen wie dumm ich bin und nix erklärt.


Vielleicht hat das so auf dich gewirkt, aber dir sei versichert, dass es Slin vermutlich nicht darum ging, dir zu "sagen, wie dumm du bist". Du musst verstehen, dass hier sehr viele Leute mit sehr unterschiedlichen Kenntnissen Fragen stellen, und je weniger Hintergrundinfos der Fragensteller gibt, umso mehr müssen wir raten. Dabei können wir im Regelfall aber leider nur auf den geposteten Codeschnipsel zurückgreifen, bei dir ist das ebenso der Fall, aus dem restlichen Text kann man nicht erkennen, wie gut du dich mit der Engine und Code allgemein auskennst. Wir helfen gerne, aber mit manchen Beiträgen wird es uns auch nicht leicht gemacht.

Wenn du gereizt oder wütend bist, ist es grundsätzlich eine gute Idee, weder einen Beitrag zu schreiben, noch einen Brief, oder ein Telefonat zu führen. Schon wenig später bereut man das wink

Jetzt:

PUZZLE!

"Camera.x" gibt dir die derzeitige Position der Kamera an.

Der Befehl c_trace(vectorA,vectorB,tracemodus) schickt eine Art "Laserstrahl" von der Position, die in VectorA angegeben wird, zu der Position in vectorB. Dabei werden ggf. bestimmte Objekte und Flächen ignoriert, welche, werden im tracemodus angegeben.
Der Rückgabewert von c_trace gibt dir an, ob und wo etwas getroffen wurde. Den Rückgabewerte erhälst du zb so:

temp = c_trace(...
(temp hat dann den Wert des Rückgabewertes).

Zusätzlich wird bei einem Treffer "target" auf die Position des Treffers gesetzt. Weitere Informationen erhälst du im Handbuch.

Wie kannst du mit dieser Information das gewünschte Verhalten erreichen?


Maybe I played too much Professor Layton...?

Last edited by Error014; 09/16/08 10:21. Reason: Added the Prof. Layton-info, hoping I'd seem a little less insane that way. Did it work?

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!
Re: Please Help sicht zur Entity [Re: Error014] #227875
09/16/08 15:40
09/16/08 15:40
Joined: Jun 2008
Posts: 146
Deutschland
M
M4sterm1nd Offline OP
Member
M4sterm1nd  Offline OP
Member
M

Joined: Jun 2008
Posts: 146
Deutschland
gib mir n tip bitte

ich habe das versucht hatte aber nicht das gewünschte Resultat:

camera.x = c_trace(player.x, camera.x, NULL);

Re: Please Help sicht zur Entity [Re: M4sterm1nd] #227906
09/16/08 18:51
09/16/08 18:51
Joined: Jul 2002
Posts: 3,208
Germany
Error014 Offline
Expert
Error014  Offline
Expert

Joined: Jul 2002
Posts: 3,208
Germany
Nicht jede Information, die ich im "Puzzle" gegeben habe ist auch tatsächlich für den Code wichtig. Wichtiger ist es, dass du den Befehl c_trace verstehst. Du hast bereits die korrekten Vektor-Parameter übergeben (player.x,camera.x), welchen Tracemodus du brauchst, hängt aber von deinem Level ab. Sehr wahrscheinlich musst du aber den Spieler "player" selbst ignorieren!. Wenn der me-pointer auf diesen zeigt, so kannst du "ignore_me" verwenden, sonst kannst du

Code:
you=player;
?????????? c_trace(??????????,?????????????,ignore_you);


verwenden. (Was an die Stelle der "?" gehört, liegt an dir, herauszufinden!)

Der Rückgabewert ist aber nur eine Zahl. Setzt du lediglich "camera.x" darauf, so veränderst du nur die X-Koordinate der Kameraposition, nicht aber die Y-, oder Z-Koordinate. (Derzeit hat camera.x gar nichts mit der Spielerposition zu tun - du setzt es auf den Abstand vom Spieler zum Hindernis!)

Überlege: Wie hängt die gewünschte Kameraposition mit dem zusammen, dass c_trace macht?. Dein c_trace-schnipsel wirkt so, als würde ich von der Spielerposition meinen Laserpointer auf die derzeitige Kameraposition (die ja falsch, weil z.B. hinter einer Wand ist) richten. Stell dir also vor, dass dazwischen eine Wand ist. Was genau ist "target" in diesem Fall?

C_trace ist ein Befehl, den man sich bildlich vorstellen kann. Nutze das aus!

Wenn du die Fragen im "Überlege"-Block beantworten kannst, wirst du den Code selbst schreiben können.
Ansonsten antworte hier, und wir arbeiten gemeinsam dran.

Bitte versuche dennoch, es selbst zu lösen - das ist in deinem eigenen Interesse!

-----

EDIT: Noch eine Sache. Ich habe geschrieben:

Quote:
"Camera.x" gibt dir die derzeitige Position der Kamera an.


Das ist nicht falsch, aber hier vielleicht irreführend.

Die "Camera" ist natürlich auch irgendwo in deinem LEvel zu finden, und zwar an der Position

camera.x
camera.y
camera.z

Das sind die drei Koordinaten, die wir ja brauchen, um die Position im raum eindeutig festzulegen.

Für bestimmte Befehle, z.B. die ganzen "vec_"-nummern, übergibt man ja Vektoren. In diesem Fall reicht es, "camera.x" zu schreiben, also z.B.

vec_add(camera.x,vector(1,2,3));

Verwendest du die Zeile "camera.x" jedoch getrennt, so veränderst du nur die X-Koordinate.

Code:
//Die Kamera ist an der Position (2|4|6).
vec_add(camera.x,vector(1,2,3));
//Jetzt ist die Kamera an der Stelle (3|6|9).
camera.x += 10;
//Jetzt ist die Kamera an der Stelle (13|6|9).


Das mag anfangs etwas verwirrend sein, aber du wirst dich schnell daran gewöhnen. Erst recht als Mastermind wink


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!
Re: Please Help sicht zur Entity [Re: Error014] #228061
09/17/08 13:34
09/17/08 13:34
Joined: Jun 2008
Posts: 146
Deutschland
M
M4sterm1nd Offline OP
Member
M4sterm1nd  Offline OP
Member
M

Joined: Jun 2008
Posts: 146
Deutschland
also ich hab das jetzt so gemacht:

c_trace(player.x, camera.x, ignore_you);

if(trace_hit)
{
vec_set(camera.x, target);
}

funzt auch ganz gut

NUR

wenn man mit der Entity in die Nähe der Decke kommt geht die Kamera immer ein Stück rein und die Decke verschwindet.

Re: Please Help sicht zur Entity [Re: M4sterm1nd] #228094
09/17/08 17:15
09/17/08 17:15
Joined: Jul 2002
Posts: 3,208
Germany
Error014 Offline
Expert
Error014  Offline
Expert

Joined: Jul 2002
Posts: 3,208
Germany
Es hilft dann, die Kamera noch etwas weiter nach vorne zu setzen. Dies kann zum einen so geschehen:

Code:
c_trace(player.x, camera.x, ignore_you);

if(trace_hit)
{
vec_set(camera.x, target);
//Setze die Kamera etwas nach vorne
vec_set(temp,vector(2,0,0)); //2 Quants nach vorne - spiel mit dem Wert
vec_rotate(temp,camera.x);
vec_add(camera.x,temp);
}


Eine weitere Methode: Setze die Kamera etwas von der getroffenen Fläche weg, indem du die Normale benutzt, etwa so:

Code:
c_trace(player.x, camera.x, ignore_you);

if(trace_hit)
{
vec_set(camera.x, target);
vec_add(camera.x,normal); //Setze die Kamera von der getroffenen Fläche weg
}


Du kannst die normale vorher natürlich auch skalieren (vec_scale). Eventuell wäre auch eine Kombination sinnvoll.


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!
Page 1 of 2 1 2

Gamestudio download | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1