Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.08.2011, 08:49

Verfahren zur Auswahl von Objekten

Hallo Zusammen

Ich habe wiedermal ein Problem =)

Ich möchte meinem Benutzer ermöglichen, dass er mehrere Objekte zugleich selektieren kann in meiner Szene.
Die Selektion soll gleich erfolgen wie ein "Windows - Select" (keine Ahnung wie ich das benennen soll =). Also einfach mit einem Rechteck (wie wenn ich mehrere Ordner in Windows markiere).

Die 4 Eckpunkte dieses Rechtecks habe ich schon. Ich weis auch, dass ich so ein Frustum bilden kann. Schlussendlich muss ich "nur" noch alle Punkte in der Szene prüfen, ob sie innerhalb oder ausserhalb einer der 4 Ebenen vom Frustum liegt.

Dies kann / glaube ich, in dem ich die Determinante berechne. Von der Ebene (definiert durch Aufhängepunkt und Normale) und einem beliebigen Punkt in der Szene.

Aber wie mache ich das???

Danke und Gruss
Master Chief

2

24.08.2011, 09:16

Vergesst meine Frage oben =) Ich bin selber drauf gekommen, gar nicht so schwierig wie anfangs gedacht.

(falls es jemand intressiert).

Ebenengleichung ist ja ax + by + cz + D = 0
Somit kann ich D ausrechnen, wenn ich für a, b, c die Normale der Ebene nehme und für x, y, z den Aufhängepunkt

D = 0 - ax - ay - az
oder anders: D = 0 - (nx * px - ny * py - nz * pz)
* = Skalarprodukt

so muss ich nur noch die einzelnen Punkte (welche ich prüfen will) in die Ebenengleichung setzen und prüfen, ob das Resultat grösser oder kleiner als 0 ist.
Dadurch weis ich, ob sie der Punkt vor oder hinter der Ebene (oder gleich darauf = 0) befindet.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

24.08.2011, 10:03

Angenommen das Objekt ist riesig und alle Eckpunkte befinden sich außerhalb der Selektion, dann sind noch immer Flächen des Objekts innerhalb des Selektion-Frustums, das Objekt wird nach Deiner Idee trotzdem nicht selektiert. Sehe ich das richtig?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

24.08.2011, 10:48

Ja, das siehst du richtig. Dies ist auch gewollt so. Es sollen effektiv nur diejenigen Objekte selektiert werden, welche sich vollständig im Frustum befinden.

Oder hast du eine andere Möglichkeit / Idee??

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

24.08.2011, 10:52

Wie schon gesagt wurde, hast Du dann Probleme mit sehr großen Objekten.
Eine andere Möglichkeit wäre, dass Du jedem Objekt eine eindeutige ID gibst und die als Farbe zum Rendern in einen speziellen Puffer benutzt. Wenn Du dann dein Auswahlrechteck hast, schaust Du in diesem Puffer nach, welche Objekte mindestens 1 sichtbares Pixel innerhalb dieses Rechtecks haben, und wählst diese dann aus.
Oder Du machst es geometrisch und prüfst, ob die Dreiecke der Objekte das Auswahl-Frustum schneiden.

PS: Ich habe mal den Titel des Themas geändert ;)

6

24.08.2011, 10:56

Ich sehe kein Problem mit grossen Objekten. Wenn der Benutzer diese Selektieren will, dann Zoomt er einfach weg und dann müsste das meiner Meinung nach trozdem funktionieren. Eine Schnittpunktprüfung mit dem Frustum ist mir auch durch den Kopf gegangen. Nur erfüllt das nicht das, was ich effektiv brauche.

Ich muss prüfen, welche Objekte sich innerhalb des Frustum befinden und welche ausserhalb.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

24.08.2011, 10:58

Funktioniert schon, ist aber umständlich.
In 3ds max kann man z.B. einstellen, ob die Objekte den Auswahlbereich nur überlappen müssen oder ob sie vollständig in ihm liegen müssen. Das finde ich gut so!

8

24.08.2011, 11:21

Ja, klar könnte man beides machen. Nur wird der Benutzer in meinem Programm sehr selten an die Situation stossen, in welcher er so weit weg zoomen muss, das es als störend wirkt. Von dem her ist eigentlich klar, wie ich das implementieren muss / will.

Im Moment funktioniert das ganze zwar noch nicht =) aber sollte in kurzer Zeit eigentlich laufen, ansonsten melde ich mich nochmal =)

9

24.08.2011, 11:38

Es ist doch ein Problem aufgetaucht. Ziemlich sicher stehe ich wiedereinmal auf dem Schlauch, weil das nicht so schwierig sein kann. Darum hoffe ich jetzt auf eure Hilfe =)

Ich habe ein Bild angehängt (frustum_sample.png). Dort ist ersichtlich, was ich suche =)
Ich habe die 4 Eckpunkte meines Frustum (p1, p2, p3, p4) und auch die Mittelpunkte (mp1, mp2, mp3, mp4).

Was ich aber nicht hinbekomme ist die Normalen der Mittelpunkte (rote Pfeile). Alle müssen entweder nach Innen oder nach Aussen zeigen, damit ich die Ebenen definieren kann. Die Ebene definiere ich durch die jeweiligen Mittelpunkte (mp) und eben diese Normalen^.

Aber ich bekomme das nicht hin.. Was muss ich tun??

Danke
»Master Chief« hat folgendes Bild angehängt:
  • frustum_sample.png

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

24.08.2011, 12:57

Moment mal, ganz langsam. Du willst schon für jede Strecke (z.B. P1->P2) eine Ebene definieren, richtig? Dafür brauchst Du ja einen dritten Vektor, welcher in die Tiefe geht (alle 4 sind übrigens unterschiedlich, weil es sich beim Frustum vermutlich um einen Pyramidenstumpf handelt und bei dem man auf die "abgeschnittene Spitze" schaut). Damit ergibt sich Deine Normale von ganz allein. Dieser Tiefenvektor ist natürlich abhängig von der Position der Punkte P1 bis P4 und Deinem ViewFrustum.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige