AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firemonkey Image3D Rendering Reihenfolge

Ein Thema von LexLing · begonnen am 3. Mär 2014 · letzter Beitrag vom 9. Mär 2014
Antwort Antwort
LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#1

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 10:44
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 11:20
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 4. Mär 2014 um 11:24 Uhr)
  Mit Zitat antworten Zitat
LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 11:40
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
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 12:42
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?
  Mit Zitat antworten Zitat
LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 12:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 13:15
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 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 4. Mär 2014, 13:35
Zur Sortierung noch:

Die Sortierung vom reinen Abstand Kamera-Objekt kann es ja nicht sein. Du musst doch nach der Länge des Lots von Sprite-Position zur Ebene der Kamera nehmen (siehe Abbildung: Grün ist länger als rot, aber blau ist kürzer als rot!).
Angehängte Grafiken
Dateityp: png Unbenannt.png (3,2 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 7. Mär 2014, 13:29
So, Problem gelöst
Ich habe die TViewport3D Komponente einfach kopiert und angepasst.
Komischerweise wurde die sort-Funktion dort nicht verwendet, was alle Probleme lösen würde.

Eine eigene Prozedur für den neuen Viewport (TGameScene), die die Möglichkeit bietet sich selbst zu aktualisieren, sollte da helfen.
Delphi-Quellcode:
procedure TGameScene.update;
var
  comp: TRenderingComp;
begin
  comp := TRenderingComp.Create;
  try
    FRenderingList.Sort(comp);
  finally
    comp.Free;
  end;

  Self.Repaint;
end;
Delphi-Quellcode:
TRenderingComp = class(TComparer<TControl3D>)
  public
    function Compare(const Left, Right: TControl3D): Integer; override;
end;
Und nun kommt die eigentliche Sortierung.
Delphi-Quellcode:
function TRenderingComp.Compare(const Left, Right: TControl3D): Integer;
begin
  // Zuerst kommen alle Elemente mit kleinerem Tag
  if left.Tag < right.Tag then
  begin
    Result := -1;
    exit;
  end
  else if left.Tag > right.Tag then
  begin
    Result := 1;
    exit;
  end;

  // Haben 2 Elemente den selben Tag, dann entscheidet die Z-Position
  if left.Position.Z > right.Position.Z then
    Result := 1
  else if left.Position.Z < right.Position.Z then
    Result := -1
  else if left.Position.X > right.Position.X then
    Result := 1
  else if left.Position.X < right.Position.X then
    Result := -1
  else
    Result := 0; // gleiche X und Z-Koordinaten
end;
Ich habe hier nach der z-Reihenfolge sortiert, weil in meinem Fall am wichtigsten ist.
Spezielle TImage3D Objekte, wie der "Untergrund" bekommen von mir einen negativen Tag mitgegeben, damit meine Compare-Funktion diese bevorzugt.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 7. Mär 2014, 18:08
Deinem Bild nach zu urteilen willst du doch so einen Sidescroller mit Parallaxe-Effekt machen, oder? Dann wäre stumpf nach Z zu sortieren ja auch richtig
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 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-2025 by Thomas Breitkreuz