Dritte Personen Sicht

  • GM 7
  • Dritte Personen Sicht

    Hallo,

    Wollte mal fragen, wie man am besten die Camera einstellt, damit die Kamera den Spieler in einer Dritt Person Sicht verfolgt?

    Mit

    GML-Quellcode

    1. d3d_set_projection(x,y,10, x+cos(direction*pi/180),y-sin(direction*pi/180),10, 0,0,1);

    Habe ich ja die Sicht vom Objekt aus.

    Ich möchte eigentlich die Sicht vom Player selber aus steuern.

    Das ist mein Spieler :

    Create-Event

    GML-Quellcode

    1. {
    2. friction = 0.2;
    3. // initialize 3D
    4. d3d_start();
    5. d3d_set_hidden(true);
    6. d3d_set_lighting(false);
    7. d3d_set_culling(false);
    8. d3d_set_fog(true,c_black,10,300);
    9. // interpolate textures
    10. texture_set_interpolation(true);
    11. }
    Alles anzeigen


    Left-Key

    GML-Quellcode

    1. {
    2. direction += 3;
    3. }


    Right- Key

    GML-Quellcode

    1. {
    2. direction -= 3;
    3. }


    Up-Key

    GML-Quellcode

    1. {
    2. var maxspeed;
    3. if keyboard_check(vk_shift) maxspeed = 3 else maxspeed = 1.5;
    4. if (speed < maxspeed ) speed = min(maxspeed ,speed+0.4);
    5. }


    Down-Key

    GML-Quellcode

    1. {
    2. var maxspeed;
    3. if keyboard_check(vk_shift) maxspeed = 3 else maxspeed = 1.5;
    4. if (speed > -maxspeed) speed = max(-maxspeed,speed-0.4);
    5. }


    Draw-Event

    GML-Quellcode

    1. {
    2. // set the projection
    3. d3d_set_projection(x,y,10, x+cos(direction*pi/180),y-sin(direction*pi/180),10, 0,0,1);
    4. // set color and transparency
    5. draw_set_alpha(1);
    6. draw_set_color(c_white);
    7. // draw floor and ceiling
    8. d3d_draw_floor(0,0,0,room_width,room_height,0,
    9. background_get_texture(texture_floor),32,32);
    10. d3d_draw_floor(0,0,32,room_width,room_height,32,
    11. background_get_texture(texture_ceiling),24,24);
    12. }
    Alles anzeigen


    Wisst ihr wie man das am Besten macht.

    PS : Bin noch Anfänger bei 3D.

    Mfg


    EDIT:

    Kann mir den niemand helfen? Wenigstens eine Seite mit Tutorials oder so was?

    :(
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Hey xx-XtremeX-xx

    Ich weiß zwar nicht, warum hier noch keiner geantwortet hat, aber ich versuchs mal (hab momentan keine möglichkeit das zu testen... deswegen nur versuchen :D ).

    Also dann mal:

    Info:
    Wenn du das aus der dritten Person machen willst, brauchst du ja keine einzelne Bewegung der Kamera (wenn doch, musst du das sagen).
    Also ich mach das jetzt so, dass man den Player immer (!) von hinten sieht.

    Das Create bleibt so, wie es ist.
    Left-/Right-/Up-/Down- Key brauchst du in dem Fall nicht (außer du willst noch die Kamera z.B. um den Player drehen).

    Draw:

    GML-Quellcode

    1. {
    2. // set the projection
    3. xfrom = obj_player.x+cos((obj_player.direction+180)*pi/180) * 64;
    4. //setzt die x-Position der Kamera auf die Stelle hinter dem Player mit der Entfernung 64
    5. yfrom = obj_player.y-sin((obj_player.direction+180)*pi/180) * 64;
    6. //setzt die y-Position der Kamera auf die Stelle hinter dem Player mit der Entfernung 64
    7. zfrom = 10;
    8. //setzt die z-Position der Kamera auf die gewünschte Höhe
    9. xto = obj_player.x;
    10. //damit die Kamera auch auf den Player guckt
    11. yto = obj_player.y;
    12. //damit die Kamera auch auf den Player guckt
    13. zto = 10;
    14. //die Höhe, wo hingeguckt wird
    15. d3d_set_projection(xfrom, yfrom, zfrom, xto,yto,zto, 0,0,1);
    16. // set color and transparency
    17. draw_set_alpha(1);
    18. draw_set_color(c_white);
    19. // draw floor and ceiling
    20. d3d_draw_floor(0,0,0,room_width,room_height,0,
    21. background_get_texture(texture_floor),32,32);
    22. d3d_draw_floor(0,0,32,room_width,room_height,32,
    23. background_get_texture(texture_ceiling),24,24);
    24. }
    Alles anzeigen


    Die Bewegung kommt dann in den Player.

    Wenn da ein Fehler drin ist, oder dir vielleicht noch etwas fehlt, frag einfach... (versuch aber mal selber :D )

    -Tobi
  • Danke erstmal für dein Posting :)

    Zum Game.

    Ich habe ja gesagt, dass alle Codes (oben) zum Obj.Player gehören, also auch die Kamerasicht.
    Aber logischer weise braucht man ja den Player (bewegt sich) und die Kamera (ist immer hinter dem Player).

    Das habe ich mal so gemacht.
    Dh. das Obj.Player hat nun nur noch :

    CreateEvent, left-right-up-down-keys

    Und das Obj.Kamera hat dann den DrawEvent.

    Dann habe ich die Kamera in den Room gestellt. --> Komisches Resultat.


    EDIT:

    Ich habe mal das Kameraobjekt weggelassen und alles Beim Player reingeschrieben.
    --> Stimmt warscheinlich eher. Nur sehe ich meinen Player nicht. Und ich kann durch die Wände mit der Sicht.
    Das könnte ich noch ändern.
    Wenn ich die Richtungstasten noch wegnehme. Wie kann ich dann steuern, wo mein Player hinlauft?

    Hier mal das Game 1.Variante --> Kamera Obj. einzeln:
    link : Dieser link wude entfernt
    Und hier das Game 2.Variante --> ohne Kamera Obj:
    link : Dieser link wude entfernt

    Hoffe du weisst was ich warscheinlich falsch gemacht habe.

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von xx-XtremeX-xx ()

  • was ist denn überhaupt der fehler? ich seh keinen cO


    edit:

    Klar siehst du den Player nicht, er wird ja auch nirgendswo gezeichnet, ausserdem kannst du das normale 2d-Zeichnen bei 3d-Spielen vergessen, dazu musst du anderen Methoden anwenden.
    "das war meine letzte flamewar PM an dich ."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von blubberblub ()

  • Schau mal die Dateien an. Dann siehst du es "leider".¨
    Es könnte, sehe ich gerade, auch noch am Sprite liegen.

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xx-XtremeX-xx ()

  • So könntest du theoretisch verhindern, dass die Kamera durch die Wand geht, allerdings sind die Proportionen falsch, dh. du musst die überprüfung der length (while ... collision_line) auf das 2d Areal umrechnen(kapiert? :P)

    GML-Quellcode

    1. xc=x+cos((direction+180)*pi/180)
    2. yc=y-sin((direction+180)*pi/180)
    3. length=10;
    4. while length<64{
    5. if !collision_line(xc*length,yc*length,x,y,obj_wall_basic,1,1)
    6. length+=1
    7. else break;
    8. }
    9. xfrom = x+cos((direction+180)*pi/180) * length;
    10. //setzt die x-Position der Kamera auf die Stelle hinter dem Player mit der Entfernung 64
    11. yfrom = y-sin((direction+180)*pi/180) * length;
    12. //setzt die y-Position der Kamera auf die Stelle hinter dem Player mit der Entfernung 64
    Alles anzeigen
    "das war meine letzte flamewar PM an dich ."
  • Dank für deine Hilfe, jedoch habe ich keine Ahnung was du damit meinst --> 3D anfänger :S

    Und ich weiss leider nicht woran das liegt, dass mein Spieler nicht angezeigt wird.

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Dein Spieler wird schlicht nicht angezeigt, da er auch gar nicht gezeichnet wird, -> du musst ihn erst zeichnen lassen, ausserdem kannst du dazu nicht die normalen 2d draw Funktionen benutzen, da nun im 3d-modus, sagen wir, alles umgestellt wurde -> du musst auf Texturen oder ähnliches zeichnen und diese entsprechend transformiert im 3-dimensionellen Raum drawen lassen..
    Btw fang besser mit nem 2d Projekt an, du wirkst überfordert in meinen Augen..
    "das war meine letzte flamewar PM an dich ."
  • Nene, die 2D Games sind kein Problem.
    Es ist nur, bis man die Codes eimal so richtig versteh.

    Ist der Code ähnlich wie beim DrawWall?

    Quellcode

    1. {
    2. d3d_draw_wall(x1,y1,z1,x2,y2,z2,tex,1,1);
    3. }
    4. tex = background_get_texture(texture_wall1);


    Oder ein ganz anderer? Also die tex ist sicher sehr ähnlich.

    Bitte schreib nochmals

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Code für was?
    Das Zeichnen einer 2-dimensionalen Textur in nem 3d-Raum?
    Sorry, da kann ich dir eher nicht helfen, hab selbst eig. noch nie wirklich mit GM d3d gearbeitet
    "das war meine letzte flamewar PM an dich ."
  • Ja, drumm hasse ich ja auc immer dieses "bis man es einmal kann" :rolleyes:
    Muss hald sein. :pinch:

    Weiss sonts jemand wie das gehen könnte ?(

    Danke Trotzdem :D

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Tut mir leid, hab bisschen blöd reagiert.

    Die Idee mit d3d_draw_wall ist vielleicht gar nicht so schlecht, jedoch müsstest du noch die entsprechenden Rotationen durchführen (mit d3d_transform_add_rotation ? ), damit das Sprite immer zur Kamera schaut... Irgendwie scheints aber auch mithilfe der normalen Draw-Funktionen zu klappen, in dem man entsprechende Transformationen durchführt, so stehts zumindest in der Hilfe(hingekriegt hab ich das noch net =( )
    Mal bisschen rumprobieren :)
    "das war meine letzte flamewar PM an dich ."
  • blubberblub schrieb:

    in dem man entsprechende Transformationen durchführt,


    Achso. Dann sollte ein einfacher DrawEvent genügen. Aber welche Transformationen meinst du?


    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Aus der GM-Hilfe (Transformations):

    d3d_transform_set_translation(100,100,10);
    draw_sprite(spr,0,0,0);
    d3d_transform_set_identity();


    So wie ich das verstehe, veränderst du mittels der d3d_transform... Funktionen
    Spoiler anzeigen
    d3d_transform_set_identity() Sets the transformation to the identity (no transformation).
    d3d_transform_set_translation(xt,yt,zt) Sets the transformation to a translation over the indicated vector.
    d3d_transform_set_scaling(xs,ys,zs) Sets the transformation to a scaling with the indicated amounts.
    d3d_transform_set_rotation_x(angle) Sets the transformation to a rotation around the x-axis with the indicated amount.
    d3d_transform_set_rotation_y(angle) Sets the transformation to a rotation around the y-axis with the indicated amount.
    d3d_transform_set_rotation_z(angle) Sets the transformation to a rotation around the z-axis with the indicated amount.
    d3d_transform_set_rotation_axis(xa,ya,za,angle) Sets the transformation to a rotation around the axis indicated by the vector with the indicated amount.
    d3d_transform_add_translation(xt,yt,zt) Adds a translation over the indicated vector.
    d3d_transform_add_scaling(xs,ys,zs) Adds a scaling with the indicated amounts.
    d3d_transform_add_rotation_x(angle) Adds a rotation around the x-axis with the indicated amount.
    d3d_transform_add_rotation_y(angle) Adds a rotation around the y-axis with the indicated amount.
    d3d_transform_add_rotation_z(angle) Adds a rotation around the z-axis with the indicated amount.
    d3d_transform_add_rotation_axis(xa,ya,za,angle) Adds a rotation around the axis indicated by the vector with the indicated amount.

    die Transformationsmatrix, mittels derer alles gezeichnet wird, dh. du stellst nur die Transformationen ein, zeichnest, was du zeichnen möchtest du setzt das ganze wieder mittels

    GML-Quellcode

    1. d3d_transform_set_identity() //Sets the transformation to the identity (no transformation).

    zurück zu den Standart-Werten, damit die darauf folgenden Zeichnungen davon nicht beeinträchtigt werden.

    Lass es dir lieber von jemandem erklären, der weis wovon er spricht, denn das hier ist lediglich eine Vermutung...
    "das war meine letzte flamewar PM an dich ."
  • Vielen Dank für deinen Beitrag.

    Ja, da könntest du Recht haben. Da ich auch sonst keine "einleuchtendere Funktion" gefunden habe.

    Auf jeden Fall : Lasse dich es wissen, wenn sich was tut. Ansonsten muss ich wohl nochmals hinter die Bücher.

    :thumbsup:


    Mfg


    EDIT:

    Ich glaube ich weiss, wie es aufgebaut sein könnte schau mal da :

    Dieser link wurde entfernt

    Bei den Monsters. Das sind ja sozusagen auch Spieler.
    Wenn man den Code abändert sollte es villeicht so gehen.
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Das is ein gutes Beispiel!

    Wichtig ist hier vorallem

    GML-Quellcode

    1. global.camsin = sin(direction*pi/180);
    2. global.camcos = cos(direction*pi/180);

    , was jeden step oder so aktualisiert werden muss und die Kamerarichtung "darstellt".
    und

    GML-Quellcode

    1. d3d_draw_wall(x-7*global.camsin,y-7*global.camcos,20,
    2. x+7*global.camsin,y+7*global.camcos,0,tex,1,1);
    ,
    also global.camsin & global.camcos,
    das 7* ist die Breite des Sprites.
    "das war meine letzte flamewar PM an dich ."
  • Na, wer sagts denn. Bin ich gut oder was ? <<Scherz>>

    Da habs geschafft. *Freu* :thumbsup: ^^

    Endlich.

    Ehm, jetz muss ich nur noch eines haben. Die Kammera darf nicht durch die Wände kommen.
    Deine Hilfe von oben klappt nicht ganz genau.

    Mfg :)
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xx-XtremeX-xx ()

  • ich habs ein wenig verbessert, leider funktionierts immer noch nicht wirklich :

    GML-Quellcode

    1. xc=cos(radtodeg(direction+180))
    2. yc=sin(radtodeg(direction+180))
    3. length=10;
    4. while length<64{
    5. if !collision_line(x+(xc*length),y+(yc*length),x,y,obj_wall_basic,1,1)
    6. length+=1
    7. else break;
    8. // set the projection
    9. xfrom = obj_player.x+cos((obj_player.direction+180)*pi/180) * length;
    10. //setzt die x-Position der Kamera auf die Stelle hinter dem Player mit der Entfernung 64
    11. yfrom = obj_player.y-sin((obj_player.direction+180)*pi/180) * length;
    12. //setzt die y-Position der Kamera auf die Stelle hinter dem Player mit der Entfernung 64
    13. }
    Alles anzeigen


    Probiers aus und spiel bisschen mit rum, vielleicht findest du ne Lösung =)



    edit: die lösung:

    GML-Quellcode

    1. length=10;
    2. while length<64{
    3. if !collision_line(x+lengthdir_x(length+1,direction+180),y+lengthdir_y(length+1,direction+180),x,y,obj_wall_basic,1,1)
    4. length+=1
    5. else break;
    6. }


    Funktioniert aber nur solange du das Spiel gameplaymässig nicht um die z-ebene erweiterst
    "das war meine letzte flamewar PM an dich ."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von blubberblub ()

  • Ok, super danke. Funzt astrein. :)


    Hier nun die Lösung für 2 Wochen zum downloaden.

    --> link : habbohighs.pytalhost.com/mein_game.zip


    Mfg und danke an alle, die mitgeholfen haben, vorallem an blubberblub :D
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Benutzer online 1

    1 Besucher