Anklickproblem (Einheitenselektion)



  • Hallo,

    ich plane so ein Echtzeitstrategiespiel zu machen (wie C&C) aber in ecter 3d Umgebung. Nun habe ich ein Problem mit dem selektieren der Einheiten.

    Ich will OpenGL benutzen. Da gibt es ja ein Konzept, so dass man erfahren kann auf welches Objekt geklickt wurde. Nun möchte ich aber auch eine Einheitenauswahl mit diesem "rechteckigen Rahmen ziehen".
    Das problem ist nun aber, wie ich nun bestimmen kann, welche Objekte ausgewählt wurden, da ich ja nur auf zwei Eckpunkte des Rahmens klicke.

    Ich habe mir schon einen Ansatz überlegt. Ich klicke nicht die Einheiten an sondern den Boden. Nun berechne ich, welche Einheit dadraufsteht.
    Dies funktioniert auch gut beim selektieren mit diesem Rechteckziehen,
    da man ja aus 2 Punkten das Rechteck bestimmen kann.
    Es gibt jedoch zwei große Probleme.

    Bei Flugeinheiten, die nicht direkt über dem Boden sind, weil der Rahmen ja
    den Boden selektiert und die Einheiten sich darüber befinden und so die
    Perspekive verzehrt wird. (Rechteck ist also nicht über der Einheit)

    Ich muss ja jede Position einer Einheit mit den am Boden selektierten rechteck vergleichen => viel Rechenleistung nötig.

    Mit welchem Konzept kann man dieses Problem lösen?



  • Funktioniert genau wie Frustum Culling.

    Bye, TGGC (Ein Jahr Helden)



  • Ja, ich kann die Perspektivenverschiebung so berechnen, dass es passt.
    Das problem entsteht aber, da ich flug und Bodeneinheiten habe.

    Oder ich habe Deine Antwort nicht ganz verstanden.



  • Andreas XXL schrieb:

    Ja, ich kann die Perspektivenverschiebung so berechnen, dass es passt.
    Das problem entsteht aber, da ich flug und Bodeneinheiten habe.

    Oder ich habe Deine Antwort nicht ganz verstanden.

    ich habe Deine Antwort nicht ganz verstanden.

    Bye, TGGC (Ein Jahr Helden)



  • Lass doch die z-Achse außer Acht und dann wenn du ein Rahmen ziehst hast du ja x,y,w,h und dann frgast du ab Welche Einheiten noch in dem Bereich liegen (wäre eine Variante)


  • Mod

    da du einen rahmen ziehst, der 2d auf deinem monitor ist, projezier einfach die boundingvolumes deiner objekte auf den screen und prüfe ob sie innerhalb des selektionsrahmens sind.

    rapso->greets();



  • TGGC schrieb:

    Funktioniert genau wie Frustum Culling.

    Beim "Picking" wie Du es machst jagst Du aus der "Kamera" eine Gerade durch den Punkt, den Du anklickst.

    Hierbei tust Du halt 4 Gerade durch die 4 Eckpunkte jagen, und baust Dir - wie TGGC so schön sagte - ein Frustum zusammen - bzw. genauer gesagt isses hier sogar 'ne "richtige" Pyramide.



  • Was bringst Einheiten ausserhalb der Sicht anzuwählen?

    Bye, TGGC (Ein Jahr Helden)



  • TGGC schrieb:

    Was bringst Einheiten ausserhalb der Sicht anzuwählen?

    Na, is' doch'n nettes Feature?!? 😃

    HAT SONST KEINER!! 😃 👍

    Nee, okay, hast mich überzeugt: Es bleibt also doch bei 'nem Frustum! 🤡 👍



  • Hallo,

    gibt es dazu irgendwo Beispiele, Tutorials oder sonst was?

    Ich habe bisher nur lesson 32 auf http://nehe.gamedev.net/
    gefunden, aber da wird nur die Auswahl von jeweils einem Objekt gezeigt!



  • Wo isn das Problem einfach nur die 2D Koordinaten zu benutzen ?



  • Unterteile deine Spielwelt in viele kleine Würfel und stelle sicher, das jeder Würfel weiss, welche Einheit sich in ihm befindet (Das heisst, wenn du Einheiten bewegst, musst du diese ggf beim einen Würfel "abmelden" und beim anderen wieder "anmelden"). Wenn du jetzt einen Rahmen ziehst, selektierst du einfach alle Einheiten in den Würfeln die innerhalb des Rahmens liegen. Das sollte auch mit Lufteinheiten problemlos gehen.

    (edit)
    Diese "Würfelisierung" 😃 kann dir später auch noch bei anderen Dingen wie Pathfinding, Kollisionsabfrage und Culling helfen 😉



  • Hallo,

    das funktioniert leider nicht, da ich eine frei schwenkbare kammera habe.

    Die normale Sicht ist wie bei solchen Spielen üblich von oben.
    Da würde es funktionieren einfach z.B die Z Achse weg zu lassen. Aber der User kann die Kammera auch wagerecht stellen, so dass man fast aus first persen sicht wie bei einem Shooter die Landschaft sieht. Zieht man nun den Rahmen, werden die falschen Einheiten oder "Würfel" ausgewählt. Somit wäre das Problem die richtige Einheit auszuwählen nur auf die Auswahl der richtigen Würfel verschoben worden.

    Das man aus der sicht sowas wie ne Pyramiede berechnen muss, meine ich auch. Aber ich schaffe es von meinen mathe kenntnissen her nicht .Das mit der Pyramiede würde ich schon schaffen. Aber das vergleichen der Einheit mit der Pyramiede schaffe ich nicht, da die einheiten ja schwer zu berechnende Formen haben und auch hinter z.B. einem Berg verborgen sein könnten.

    Das Problem ist eigentlich eine Projektion von 2d (gezogenes Rechteck) auf
    die 3d Landschaft aus der Sicht der kamera, wobei leider deutliche Verzerrungen auftreten.

    Sowas muss doch schon irgend Jemand mal gemacht haben immerhin gibt es einige Spiele die das können.

    Am liebsten wäre mir ein Tutorial oder ne Anleitung wie das geht!
    (Zur Not reichen auch einfach die Berechnungsformeln)

    MfG
    Andreas



  • Versteh das Problem nicht. Der schwierigste Teil daran ist nur, die Mauskoordinaten in die 3D Welt zu mappen. Dafür gibts genug Beispiele (suche nach "Picking" o.ä). Wenn du start- und endpunkt des Selektions-Rahmens hast, kannst du ganz einfach die eingeschlossenen Würfel ermitteln und fertig. Da spielt es auch keine Rolle, ob die Einheit im betreffenden Würfel in der Luft oder hinter einem Berg steht.



  • Hallo,

    leider reicht es nicht, nur die Eckpunkte (Mauskoordinaten) ins 3d zu mappen, weil sich auch die Seiten des Rechtecks verformen müssen.

    Es muss das gesamte Rechteck auf 3d gemapt werden.

    Beispiel

    Rechteck:
    ----------------
    |              |
    |              |
    |              |
    |              |
    |---------------
    
    Landschaft: Soll nen Berg sein (von oben gesehen)
    
         /()\
         ((O))
         \()/
    
    Rechteck auf Berg:
    
       / -- - -\
    ---   /()\  --
    |     ((O))  |
    |     \()/   |
    |            |
    |            |
    |            |
    --------------
    

    Am berg muss sich das Quadrat verzerren, wie die Höhenlinien auf einer Landkarte. Und die verzerrung wird schlimmer, umso schräger man auf die
    Landschaft blickt.

    Meine Frage ist, wie ich diese Verzerrung berechnen kann?



  • Andreas XXL schrieb:

    Meine Frage ist, wie ich diese Verzerrung berechnen kann?

    Als Schnitt des Frustums mit Deinem "Terrain".



  • Sgt. Nukem schrieb:

    Als Schnitt des Frustums mit Deinem "Terrain".

    *gähn*

    Bye, TGGC (Keine Macht den Dummen)



  • TGGC schrieb:

    Sgt. Nukem schrieb:

    Als Schnitt des Frustums mit Deinem "Terrain".

    *gähn*

    Nur weil ich wieder Scheisse laber mußt Du doch nicht hier öffentlich rumgähnen... 😎



  • Hallo,

    ich seh schon, hier kann oder will mir Keiner helfen -- ENDE!



  • Andreas XXL schrieb:

    ich seh schon, hier kann oder will mir Keiner helfen -- ENDE!

    😕

    Wo hast Du denn noch Probleme??

    Hast Du schonmal ein View Frustum Culling selbst berechnet??
    Schau' Dich mal da um -> Software-Renderer.

    Was Du sonst brauchst ist ein Mathe-Buch über Vektor-Algebra.


Anmelden zum Antworten