3D Objekt posizion auf dem Bildschirm

  • 3D Objekt posizion auf dem Bildschirm

    Hallo!
    Ich hab n Problem in meinem 3D RTS. Ich versuche gerade das anwählen der Einheiten hinzukriegen, was sich leider als problem herausstelte :(
    Ich hab ziemlich viele rumgerechnet, doch ich krieg das einfach nicht hin.

    Zuerst hab ich die Maus mal durch ein Objekt ersetzt ,welches sich im 3d raum rumbewegt, gibt aber Probleme mit dem Anwählbalken, ds sich das Spiel auf ner Karte mit höhen abspielt und zusammen mit dem Menü funzt das auch nicht.

    Dann hab ichs mal mit Winkelberechnung versucht, ging aber hauptsächlich in die hose...

    Gibt es da zufällig ein grosses Mathegenie unter euch das mir helfen kann?
    Oder gibt es ne einfache funktion die ich übersehn habe?

    Hoffe ihr begreift mein prob und könnt mir helfen...
  • sowas ist nicht grade einfach, abe rich habe mir selber bereits den kopf darüber zerbrochen. es sind ein bischen viele variablen und ich habe kein create-event skript fertig gemacht, deshalb lohnt es sich die option "tread uninizialized variables as value 0" zu aktivieren:

    du brauchst folgendes skript, welches du z.b. scr_VectorSet nennst:

    GML-Quellcode

    1. //arguments 0-10: die gleichen wie bei d3d_set_projection_ext().
    2. // vector entsprechend zur camera errechnen
    3. dX = argument3-argument0;
    4. dY = argument4-argument1;
    5. dZ = argument5-argument2;
    6. mm = sqrt(dX*dX+dY*dY+dZ*dZ);
    7. dX /= mm;
    8. dY /= mm;
    9. dZ /= mm;
    10. // ortogonale änderung
    11. uX = argument6;
    12. uY = argument7;
    13. uZ = argument8;
    14. mm = uX*dX+uY*dY+uZ*dZ;
    15. uX -= mm*dX;
    16. uY -= mm*dY;
    17. uZ -= mm*dZ;
    18. mm = sqrt(uX*uX+uY*uY+uZ*uZ);
    19. uX /= mm;
    20. uY /= mm;
    21. uZ /= mm;
    22. // den vector skalieren
    23. tFOV = tan(argument9*pi/360);
    24. uX *= tFOV;
    25. uY *= tFOV;
    26. uZ *= tFOV;
    27. // zwischenvector
    28. vX = uY*dZ-dY*uZ;
    29. vY = uZ*dX-dZ*uX;
    30. vZ = uX*dY-dX*uY;
    31. // zv hochskalieren
    32. // fertig:
    33. vX *= argument10;
    34. vY *= argument10;
    35. vZ *= argument10;
    Alles anzeigen


    das rufst du dann im begin step_event des camerao-bjects so auf:

    GML-Quellcode

    1. scr_VectorSet(x,y,z,x+vector_x,y-vector_y,z+vector_z,0,0,1,45,1.33333);


    in den step-event der camera muss noch folgendes:

    GML-Quellcode

    1. width=2*mouse_x/view_wview[0]-1;
    2. height=1-2*mouse_y/view_hview[0];
    3. mX = dX+uX*height+vX*width;
    4. mY = dY+uY*height+vY*width;
    5. mZ = dZ+uZ*height+vZ*width;
    6. placex=ceil(x-z*mX/mZ);
    7. placey=ceil(y-z*mY/mZ);


    so... jetzt kannst du im 3d raum "placex" und "placey" wie mouse_x und mouse_y verwenden. manchmal gibt es fehler, ich glaubve wenn die werte 32000 überschreiten, aber da bin ich mir nicht sicher...

    viel spass damit :D
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Erstmal Danke für die schnelle Antwort!

    Mein erster Versuch das ganze nachzuvolziehen ist leider gescheitert. Ich beschäftige mich aber mal weiterhin mit deinem Script . :)

    *ausprobiert*

    So hab jetzt wenigstens mal begriffen was der Skript macht, doch leider ist es nicht das was ich suche bzw. nicht genau, da in meinem RTS die Einheiten auch die Z-Koordinate verändern, wenn sie einen Hang hochlaufen.

    bei mir sollte das ganze umgekehrt laufen.
    Ich sollte aus X, Y, Z Koordinaten die X und Y auf dem bildschirm erfahren, wenn das 3d objekt überhaupt im Sichtfeld ist.

    Trotzdem nochmals Danke...

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

  • Benutzer online 1

    1 Besucher