Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Firemonkey Image3D Rendering Reihenfolge (https://www.delphipraxis.net/179375-firemonkey-image3d-rendering-reihenfolge.html)

LexLing 3. Mär 2014 16:22

Firemonkey Image3D Rendering Reihenfolge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag liebe Community,

seit einiger Zeit zerbreche ich mir den Kopf über ein gewisses Problem.
Ich habe mir in Firemonkey ein TViewport3D erstellt, wo ich viele verschiedene TImage3D Objekte reinlade.
Die meisten dieser Objekte sind PNGs, die teilweise Transparent sind, was zu folgenden Problemen führt:
Einige dieser Images werden offensichtlich in der falschen Reihenfolge reingeladen, da diese entweder abgeschnitten sind oder erst gar nicht transparent dargestellt werden.
(Bild im Anhang)

Nach einigem googlen, habe ich Lösungsansätze zu dieser Problemstellung gefunden, bei denen die Reihenfolge beeinflusst werden sollte.
Eines davon unter diesem Link:

http://www.delphitools.info/2011/11/...in-firemonkey/

Diesen Lösungsansatz habe ich in meinen Quellcode einbinden wollen, scheiterte aber schon an "SortList", was ich in Delphi XE5 leider nicht finden konnte.
Ersatzweise habe ich es leicht abgewandelt mit der Methode "Sort" versucht, was aber in der Darstellung leider rein gar nichts verändert. :(
Hier der Quellcode dazu:
Delphi-Quellcode:
vp.Sort(
function (i1, i2: TFmxObject): Integer
var
  o1,o2: TControl3D;
  x1, x2: Double;
begin
  o1 := nil; o2 := nil;
  if TfmxObject(i1) is TControl3D then o1 := TControl3D(i1);
  if TfmxObject(i2) is TControl3D then o2 := TControl3D(i2);
  if (o1 <> nil) and (o2 <> nil) then
  begin
    x1 := o1.Position.Vector.Distance(vp.cam.Position.Vector);
    x2 := o2.Position.Vector.Distance(vp.cam.Position.Vector);
    Result := Trunc((x2 - x1)*1000);
  end else
    Result := 0;
end
);
Nun frage ich mich wie ich Einfluss auf die Reihenfolge haben oder anderweitig das Problem lösen kann.
Freue mich auf eure Lösungsvorschläge.

Ich hoffe, ihr könnt mir weiterhelfen :)
Bitte seid nachsichtig, da dies mein erster Delphi Forum Auftritt ist.
Liebe Grüße
LexLing

mkinzler 3. Mär 2014 16:34

AW: Firemonkey Image3D Rendering Reihenfolge
 
Unterscheiden sich deren z-Werte?

Sir Rufo 3. Mär 2014 16:38

AW: Firemonkey Image3D Rendering Reihenfolge
 
Nimm doch mal diese Zeile raus
Delphi-Quellcode:
Result := Trunc((o1.Position.X - o2.Position.X)*1000);

Der schöne Günther 3. Mär 2014 17:09

AW: Firemonkey Image3D Rendering Reihenfolge
 
Ich verstehe die Sortierfunktion ehrlich gesagt auch nicht wirklich-

Bei Sprites mit Transparenz kommst du nicht Drumherum, die von hinten nach vorne zu zeichnen. Die anonyme Sortiertfunktion muss eigentlich beim Vergleich von zwei Dingen nur einen Wert <0, gleich Null oder >0 ausgeben können. Multiplizieren oder Nachkommastellen abschneiden muss nicht sein.

Ich kenne mich mit FireMonkey nicht aus, aber spontan hätte ich gesagt (bin aus der 3D-Geschichte langsam schon zu lange draußen :-( ) gesagt, die Baum-Sprites werden vom Z-Buffer stellenweise als "nicht transparent" aufgenommen- Sprich:
  1. Vorderer Baum wird gerendert
  2. ZBuffer merkt sich das komplette Rechteck
  3. Hinterer Baum wird gendert: Besteht den Tiefentest gegen den vorderen Baum nicht und wird dort nicht gerendert

Ich weiß nicht, wie man das mit FireMonkey macht, aber kannst du nicht sagen dass alles, wo die diffuse Textur einen Alphawert > schwellwert hat, das nicht in den Z-Buffer geht?

LexLing 4. Mär 2014 10:44

AW: Firemonkey Image3D Rendering Reihenfolge
 
Danke erstmal für die Antworten.

@mkinzler:
Ja, die z-Werte sind unterschiedlich.

@Sir Rufo:
Die Zeile war nur noch aus Versehen drin.
Aber auch ohne sie geht es leider nicht.

@Der schöne Günther:
Wenn das so wäre wie du sagst, dann müsste der Effekt doch bei allen Bäumen auftreten.
Aber bei vielen geht es (richtig).

Ich habe mal die Reihenfolge wie ich die Objekte erzeuge geändert.
Das ändert auch die Fehler, aber leider werden die Objekte zwar in einer anderen Reihenfolge gezeichnet - aber nicht so, wie ich sie erzeuge.

Irgendwie macht diese sort-Funktion gar nichts. Ich habe sie mal in:
Delphi-Quellcode:
  vp.Sort(
  function (i1, i2: TFmxObject): Integer
  var
    o1,o2: TControl3D;
    x1, x2: Double;
  begin
    o1 := nil; o2 := nil;
    if TfmxObject(i1) is TControl3D then o1 := TControl3D(i1);
    if TfmxObject(i2) is TControl3D then o2 := TControl3D(i2);
    if (o1 <> nil) and (o2 <> nil) then
    begin
      if o1.Position.Z < o2.Position.Z then
        Result := -1
      else if o1.Position.Z > o2.Position.Z then
        Result := 1
      else
        Result := 0;
    end else
      Result := 0;
  end

  );
geändert, aber nichts tut sich.

Muss ich denn eigentlich immer die Funktion update des TViewPort3D aufrufen, wenn ich die Kamera-Position ändere?
Oder mache ich da was falsch?
Die sort-Funktion rufe ich einmal nach dem Erzeugen aller Objekte und dann immer vor einem update auf.
Muss ich das vielleicht anders machen?

Sir Rufo 4. Mär 2014 11:20

AW: Firemonkey Image3D Rendering Reihenfolge
 
Die Zeichenreihenfolge hängt nicht von der absoluten Position des einzelnen Objekts ab, sondern vom relativen Abstand zum aktuellen Betrachtungsstandpunkt.

Je weiter weg, desto früher zeichnen.

Das muss deine Sortierung hinbekommen.

Solange du aber nicht den relativen Abstand in irgend einer Weise hier ins Spiel bringst, wird die Sortierung alles liefern nur nicht das gewünschte Ergebnis.

LexLing 4. Mär 2014 11:40

AW: Firemonkey Image3D Rendering Reihenfolge
 
Die Sortierung mit dem relativen Abstand war auch mein erster Gedanke und habe sie auch schon ausprobiert.
Die sort-Funktion von Firemonkey aber scheint offensichtlich gar nichts zu machen.
Egal, wie ich versuche eine Sortierungsreihenfolge anzuordnen, es passiert gar nichts (es sieht immer aus wie auf dem Bild im Anhang).

Ich scheine Firemonkey keine Reihenfolge durch die sort-Funktion angeben zu können :(

Der schöne Günther 4. Mär 2014 12:42

AW: Firemonkey Image3D Rendering Reihenfolge
 
Ich sehe nur, dass der Kram mit der Sortierung noch aus dem seligen 2011 ist. FireMonkey hat sich ja doch ein paar mal gewandelt. Kann es sein, dass man es ganz anders machen muss?

LexLing 4. Mär 2014 12:52

AW: Firemonkey Image3D Rendering Reihenfolge
 
Man sieht auch auf der Seite aus dem Jahre 2011, dass dort die Funktion "sortList" benutzt wurde.
Auf die kann ich heutzutage leider nicht mehr zugreifen.
Wäre sehr gut möglich, dass ein anderer Lösungsansatz nötig wäre.

Sir Rufo 4. Mär 2014 13:15

AW: Firemonkey Image3D Rendering Reihenfolge
 
Zitat:

Zitat von LexLing (Beitrag 1250518)
Die Sortierung mit dem relativen Abstand war auch mein erster Gedanke und habe sie auch schon ausprobiert.
Die sort-Funktion von Firemonkey aber scheint offensichtlich gar nichts zu machen.
Egal, wie ich versuche eine Sortierungsreihenfolge anzuordnen, es passiert gar nichts (es sieht immer aus wie auf dem Bild im Anhang).

Ich scheine Firemonkey keine Reihenfolge durch die sort-Funktion angeben zu können :(

Welche Delphi-Version hast du denn im Einsatz? (ah, gerade im ersten Beitrag gesehen XE5)
Bei XE5 wird die
Delphi-Quellcode:
TViewPort3D.FRenderingList
auf jeden Fall schon mal von selbst passend sortiert (abhängig von der Kamera).

Damit dürfte das eigene Sortieren wohl ins Leere laufen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz