Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [DirectX] Flip Y Axis (https://www.delphipraxis.net/80481-%5Bdirectx%5D-flip-y-axis.html)

igel457 9. Nov 2006 14:58


[DirectX] Flip Y Axis
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

da ich mit meinem Spiel die absoluten Grenzen von DelphiX erreicht habe, schreibe ich gerade an einer neuen 2D Engine, welche DirectX 9 verwendet.

Ich setze die VIEW und die PROJECTION Matrix am anfang meines Programmes mit folgenden Zeilen:

Delphi-Quellcode:
procedure SetupScene(Appl:TAndorraApplication;AWidth,AHeight:integer);
var centerx,centery:single;
    pos, dir, up : TD3DXVector3;
    matView, matProj: TD3DXMatrix;
begin
  if Appl <> nil then
  begin
    with TAndorraApplicationItem(Appl) do
    begin
      pos := D3DXVector3 (Awidth/2,AHeight/2,-10);
      dir := D3DXVector3 (Awidth/2,AHeight/2,0);
      up := D3DXVector3 (0,1,0);

      D3DXMatrixLookAtLH( matView, pos, dir, up);
      Direct3d9Device.SetTransform(D3DTS_VIEW, matView);

      D3DXMatrixOrthoLH( matProj, Awidth, Aheight, 0,100);
      Direct3d9Device.SetTransform(D3DTS_PROJECTION, matProj);
    end;
  end;
end;
Problem ist nun, dass der Koordinatenursprung nun links unten und nicht links oben liegt.
Wie kann ich die Y Achse umdrehen?


Ich habe schon stundenlang gesucht aber nichts (brauchbares) gefunden (Mal abgesehen von einigen Leuten, die das selbe Problem, aber keine Lösung hatten. Das einzige war das folgende...
http://209.85.135.104/search?q=cache:aI4kwcynbfUJ:discuss.microsoft.com/SCRIPTS/WA-MSD.EXE%3FA2%3Dind0303c%26L%3Ddirectxdev%26D%3D1%2 6P%3D14229%26F%3DP+D3DXMatrixOrthoLH+origin&hl=de& amp;gl=de&amp;ct=clnk&amp;cd=10&amp;lr=lang_de|lan g_en
doch ich bekomme den Code nicht so richtig zum Funktionieren...

Im Anhang befindet sich mal noch ein Bild, wie es aussieht und wie es eigentlich aussehen sollte.

Schon mal Danke,
Igel457

PS: Ich möchte ID3DXSprite nicht verwenden.

igel457 9. Nov 2006 17:47

Re: [DirectX] Flip Y Axis
 
Hm...

Ich glaube ich Rechne halt einfach ResY-SpriteHeight-Y...
Damit gehe ich allen Problemen aus dem Weg.

Wenn trotzdem jemand eine Idee hat, wie man das Problem von oben anders lösen könnte bin ich immer dafür offen...

JasonDX 9. Nov 2006 19:00

Re: [DirectX] Flip Y Axis
 
AFAIK sollte es reichen, den Y-Wert des Up-Vektors zu negieren. ;)

greetz
Mike

Khabarakh 9. Nov 2006 19:07

Re: [DirectX] Flip Y Axis
 
Du hast doch die drei Vektoren, nun musst du nur noch überlegen ;) ...
Das Leichteste wäre es wohl, die Kamera genau von der anderen Seite (positive Z-Achse) auf die XY-Plane schauen (-> X+ nach links, Y+ oben) und sie dann 180° um ihre eigene Achse drehen zu lassen, also den Up-Vektor einfach umzudrehen (-> X+ nach rechts, Y+ nach unten, wie du es gewünscht hast).

[edit]Hee, wo kommst du denn her :stupid: . Negieren allein reicht aber wie gesagt nicht, damit würdest du die X-Achse mit umkehren. [/edit]

[edit id="1"] Eine andere Möglichkeit wäre die Up-Negation + die RightHand-Funktionen. Kommt aber ziemlich aufs Gleiche hinaus; auch vom Schreibaufwand wäre es nur Negieren des Kamera-Z-Wertes vs. Ersetzen von LH durch RH. [/edit]

igel457 9. Nov 2006 19:34

Re: [DirectX] Flip Y Axis
 
Zitat:

Zitat von Khabarakh
[edit id="1"] Eine andere Möglichkeit wäre die Up-Negation + die RightHand-Funktionen. Kommt aber ziemlich aufs Gleiche hinaus; auch vom Schreibaufwand wäre es nur Negieren des Kamera-Z-Wertes vs. Ersetzen von LH durch RH. [/edit]

Hey, danke... So gehts...

Für alle, die das selbe Problem hatten/haben wie ich, hier die Lösung:
Delphi-Quellcode:
procedure SetupScene(Appl:TAndorraApplication;AWidth,AHeight:integer);
var centerx,centery:single;
    pos, dir, up : TD3DXVector3;
    matView, matProj, matRotate: TD3DXMatrix;
begin
  if Appl <> nil then
  begin
    with TAndorraApplicationItem(Appl) do
    begin
      pos := D3DXVector3 (Awidth/2,AHeight/2,-10);
      dir := D3DXVector3 (Awidth/2,AHeight/2,0);
      up := D3DXVector3 (0,-1,0);

      D3DXMatrixLookAtRH( matView, pos, dir, up);
      Direct3d9Device.SetTransform(D3DTS_VIEW, matView);

      D3DXMatrixOrthoRH( matProj, Awidth, Aheight, 0,100);
      Direct3d9Device.SetTransform(D3DTS_PROJECTION, matProj);
    end;
  end;
end;
Nochmal ein dickes Dankeschön an alle. :bounce1:
Und für alle neugierigen...


...so siehts aus :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 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