![]() |
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: ![]() 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:
Nun frage ich mich wie ich Einfluss auf die Reihenfolge haben oder anderweitig das Problem lösen kann.
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 ); 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 |
AW: Firemonkey Image3D Rendering Reihenfolge
Unterscheiden sich deren z-Werte?
|
AW: Firemonkey Image3D Rendering Reihenfolge
Nimm doch mal diese Zeile raus
Delphi-Quellcode:
Result := Trunc((o1.Position.X - o2.Position.X)*1000);
|
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:
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? |
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:
geändert, aber nichts tut sich.
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 ); 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? |
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. |
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 :( |
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?
|
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. |
AW: Firemonkey Image3D Rendering Reihenfolge
Zitat:
Bei XE5 wird die
Delphi-Quellcode:
auf jeden Fall schon mal von selbst passend sortiert (abhängig von der Kamera).
TViewPort3D.FRenderingList
Damit dürfte das eigene Sortieren wohl ins Leere laufen ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz