Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Leichter Zugriff auf DirectX durch Kapselung (https://www.delphipraxis.net/27668-leichter-zugriff-auf-directx-durch-kapselung.html)

schmorbraten 13. Aug 2004 17:46


Leichter Zugriff auf DirectX durch Kapselung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Ich habe eine ganze Menge Objekte entworfen, mit denen man DirectX nutzen kann, ohne Tonnen von Code schreiben zu müssen.
  • Scene, Cameras, Lights, Mouse, Keyboard, Textures, Polygons, Font, Fog, Shadow, Transparency....und einige Beispiele + Hilfedatei
Home of Unit xorDX8.pas

DP-Maintenance 6. Sep 2004 11:50

DP-Maintenance
 
Dieses Thema wurde von "Chakotay1308" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Open-Source" verschoben.
Eher ein OpenSource-Projekt, als ein Code-Library-Eintrag.

mimi 18. Sep 2004 18:07

Re: Leichter Zugriff auf DirectX durch Kapselung
 
ich habe die kapslung getestet und muss sagen: nicht schlecht, die ist nicht vergleichbar mit delphiX viel einfacher und kann zugleich auch mehr(auch wenn ich noch nicht alles verstanden habe)

aber was mir aufgefallen ist:

wenn du ein objekt erstl und eine andere position haben möchtes must du sie immer verschieben mit move habe ich gemacht und als ich das objekt drehen wollte um die Z achse hat sich die position immer verändern und es hat eine kreis bahn um die andre objekte gezogen, mein qullcode sieht so aus:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  xorDXThrowAllOtherExceptions := True;
  xorDXThrowCameraTransformationExceptions := False;
  xorDXThrowIndexSizeException := True;
  xorDXThrowCapsException := True;
  //creation
  Scene := TxorDXScene.Create(Handle);
  Camera := TxorDXCamera.Create(Scene);
  Rect  := TxorDXRect.Create(Scene, 2, 2, 2, 2); //set standard coordinates and colors

  Wand1:= TxorDXRect.Create(Scene,2,2,2,2);
  Wand1.Color[1,0]:=clWhite; // rechts Unten
  Wand1.Color[1,1]:=clBlack; // rechts oben
  Wand1.Color[0,1]:=clYellow; // Oben Lings
  Wand1.Color[0,0]:=clBlue; // Lings Unten

  Wand2:= TxorDXRect.Create(Scene,2,2,2,2);
  Wand2.SetStandard;
  Wand2.Move(1.9,0,0);
  Wand2.FixTransformation;

  Wand2.Color[1,0]:=clWhite; // rechts Unten
  Wand2.Color[1,1]:=clBlack; // rechts oben
  Wand2.Color[0,1]:=clYellow; // Oben Lings
  Wand2.Color[0,0]:=clBlue; // Lings Unten

  Scene.CreateBuffers;
  //start
  Camera.SetStandard;
  Camera.Activate;
  Scene.BackgroundColor:=clBlue;
  Scene.SetAmbientLight(255,125,255,250);


  Scene.LightsOn:=True;
  Scene.OnDraw := Draw; //set draw routine
  Scene.StartLooping;
  Scene.Move(-1,1,1);
  Scene.RotateY(-10);

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //free in inverted order of creation
  FreeAndNil(Rect);
  FreeAndNil(Camera);
  FreeAndNil(Scene);
end;

//repeated drawing routine
procedure TForm1.Draw(Sender: TObject);
begin
  Scene.Clear;

  Rect.Insert;
  Rect.RotateZ(-0.10);
  Rect.Draw;


  Wand1.Insert;
  //Wand1.RotateX(-0.01);
  Wand1.Draw;

  Wand2.UndoTransformation;
  Wand2.Insert;

  Wand2.RotateZ(0.10);
  Wand2.Draw;

//  Camera.Move(1,1,4);
end;
(ich habe einfach ein beispiel von dir genommen und es verändert *G*)

und ich hatt einen system absturzt bzw. mein loptop ging auf einmal aus als ich DrawStart mit 10 gesetzt hatte

eine deutsche hilfe währe nicht schlecht, weil sonst müste ich immer den qullcode durcharbeiten von dir...


und das mit den Alpha geht bei mir nicht ich habe es genauso gemacht wie mit den farben nur halt Alpha davor geschrieben und das objekt war nicht durchsichtig, warum nicht ???


kann man die camaer an ein objekt binden ??? bzw. die position verändern weil ich dort move aufgerufen habe passierte leider nichts :(

aber mach auf jedenfall weiter !!!

schmorbraten 19. Sep 2004 19:30

Re: Re: Leichter Zugriff auf DirectX durch Kapselung
 
Hallo und Danke für Dein Lob.

Zu Deinen Bemerkungen:

HilfeDatei
Zur Zeit vervollständige ich die englische Hilfe, so etwas raubt unheimlich Zeit und hat nur begrenzten Spaßfaktor. Eine englische Hilfe trifft ein größeres Publikum habe ich mir so gesagt...

Position
Du benutzt ein TxorDXRect. Das ist ein n x m - Gitter (in Deinem Fall 2x2), dessen Knoten entlang eines a x b - Rechtecks gleichmäßig positioniert werden. Die Knoten-Positionen werden automatisch berechnet, hier (0,0)(a,0)(0,b)(a,b). Du hast aber volle Kontrolle über Eigenschaften eines jeden Knotens mittels der Vertex-property:
Delphi-Quellcode:
//u = 0..n-1 v=0..m-1
PxorDXVertexClassic(Rect.Vertex[u,v])^ := GetVertexClassic(-0.5,0,-0.3, 0,0,0, clBlack,0); //Pos x,y,z; Normal nx,ny,nz; VertexColor, VertexAlpha
Die PxorDXVertexClassic-Konvertierung ist notwendig, da Knoten auch andere Formate haben können. Bearbeitest Du sowieso alle Positionen manuell, kannst Du auch eine TxorDXMap, also ein n x m - Gitter, benutzen. Details siehe mitgeliefertes Beispiel Polygon.exe und Crash Course (in der Hilfe). (Eventuell neue xorDX8Update.zip runterladen)

Rotation
Rotationen finden stets um die globalen Szenen-Achsen statt. Du solltest daher
1. eventuell mit Rect.MoveCenter(True) den Schwerpunkt des Objektes in den Szenen-Nullpunkt verschieben
2. Rect.Rotate... das Objekt drehen
3. dann erst verschieben
(s. Beispiel Polygon.exe)
Alternativ kann man auch mit RotateAxis die Drehachse direkt angeben.

DrawStart
Jedes Objekt besteht aus Primitives (entweder Dreiecke oder Linien bzw. Punkte). Ein n x m - TxorDXRect besteht aus (n-1)*(m-1) Vierecken und jedes Viereck aus 2 Dreiecken. Dein 2x2-Rect besteht demzufolge aus genau 2 Dreiecken. Mit DrawStart (klassisch 0) kann man angeben, ab welchem dieser Primitives der Rendervorgang begonnen wird, bei dir also 0 oder 1. (s.a. Polygon.exe und VertexAndIndex.exe)

AlphaBlending
Mit der Alpha-Property hast Du jedem Knoten einen Alpha-Wert zugewiesen, sehr gut. Um AlphaBlending zu benutzen musst Du noch ein TxorDXAlphaBlending erzeugen und einen Blend-Effekt (z.B. BlendSrcAlpha) + Activate aufrufen. Oder einfach nur ein TxorDXTransparency und Activate. (s.a. Beispiel AlphaBlending.exe)

Camera
Nun, die Kamera braucht noch ein anschließendes Activate, um Änderungen an ihr zu realisieren. Ein Move oder Rotate bei Kameras hat jedoch keinen Einfluss auf die Vektoren LookAt, Direction, Position und Up. Besser ist es MoveTo, MoveHoriz, MoveVert, RotateHoriz etc zu benutzen (i.a. mit Parameter xorDXCamHuman oder xorDXCamID), da sich diese Änderungen auch auf die Vektoren auswirken. (s.a. Beispiel Demo.exe)

PS
Wand1 und Wand2 wieder freigeben!
Anbei geänderter Code als Attachment

Viel Erfolg,
xor alias schmorbraten

Neuer Code:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin

  //creation
  Scene := TxorDXScene.Create(Handle);
  Camera := TxorDXCamera.Create(Scene);
  Rect  := TxorDXRect.Create(Scene, 2, 2, 2, 2); //set standard coordinates and colors
  Rect.MonoAlpha(0.7);

  Wand1:= TxorDXRect.Create(Scene,2,2,2,2);
  Wand1.Color[1,0]:=clWhite; // rechts Unten
  Wand1.Color[1,1]:=clBlack; // rechts oben
  Wand1.Color[0,1]:=clYellow; // Oben links
  Wand1.Color[0,0]:=clBlue; // links Unten
  Wand1.MonoAlpha(0.7);

  Wand2:= TxorDXRect.Create(Scene,2,2,2,2);
  Wand2.Color[1,0]:=clWhite; // rechts Unten
  Wand2.Color[1,1]:=clBlack; // rechts oben
  Wand2.Color[0,1]:=clYellow; // Oben links
  Wand2.Color[0,0]:=clBlue; // links Unten
  Wand2.MonoAlpha(0.7);

  AlphaBlending := TxorDXAlphaBlending.Create(Scene);
  AlphaBlending.BlendSrcAlpha;

  Scene.CreateBuffers;
  //start
  Camera.SetStandard;
  Camera.Activate;
  Scene.BackgroundColor:=clBlue;
  Scene.SetAmbientLight(255,125,255,250); //Anmerkung: statt hellem Hintergrundlicht vielleicht ein TxorDXDirectionalLight einsetzen
  Scene.LightsOn:=True;
  Scene.StartLooping(Draw);
  Scene.Move(-1,1,1);
  Scene.RotateY(-10);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //free in inverted order of creation
  FreeAndNil(AlphaBlending);
  FreeAndNil(Wand2);
  FreeAndNil(Wand1);
  FreeAndNil(Rect);
  FreeAndNil(Camera);
  FreeAndNil(Scene);
end;

//repeated drawing routine
procedure TForm1.Draw(Sender: TObject);
begin
  Scene.Clear;

  Rect.Insert;
  Rect.RotateZ(-0.10);
  Rect.Draw;

  Wand1.Insert;
  Wand1.RotateX(-0.01);
  Wand1.Draw;

  //Achtung: AlphaBlending funktioniert von hinten nach vorne,
  //also das aktuelle Objekt ist nur transparent zu zuvor eingefügten Objekten!!!!
  AlphaBlending.Activate; //wand2 ist zu 30% transparent da scralpha=wand2alpha=0.7;

  Wand2.UndoTransformation;
  Wand2.Insert;
  Wand2.MoveCenter(True); //Schwerpunkt nach 000 verschieben
  //Wand2.RotateZ(0.3);  //feste rotation da undotransformation nach jedem draw
  Wand2.RotateZ(RotationsPerSecond(0.3)); //bei jedem draw wird um einen größeren winkel gedreht (0.3 umdrehungen pro sec)
  Wand2.Move(1.9,0,0);  //erst nach dem drehen verschieben
  Wand2.Draw;

  AlphaBlending.Deactivate;

  Camera.MoveHoriz(0.007, xorDXCamID); //camera wird bei jedem draw etwas verschoben
  Camera.Activate;

end;

initialization

  xorDXThrowAllOtherExceptions := True;
  xorDXThrowCameraTransformationExceptions := False;
  xorDXThrowIndexSizeException := True;
  xorDXThrowCapsException := True;
  InitRotationPerSecond;

end.

mimi 25. Sep 2004 18:04

Re: Leichter Zugriff auf DirectX durch Kapselung
 
danke, werde ich gleich mal testen !!!

mimi 25. Sep 2004 18:29

Re: Leichter Zugriff auf DirectX durch Kapselung
 
wie würdes du mehre objekte verwalten ?
ich habe mir dafür immer ein record erzeugt und bentutz !

schmorbraten 26. Sep 2004 21:16

Re: Re: Leichter Zugriff auf DirectX durch Kapselung
 
Nun, so allgemein würde ich die Frage mit dem Delphi-Objekt TObjectList beantworten. Ob es für Spieleprogrammierer sinnvollere Strukturen gibt, weiss ich nicht, da kenn ich mich nicht aus.
Gruss xor

Maa83 27. Sep 2004 13:38

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Hallo,

als erstes mal ein gaaaanz großes Lob von mir :)

nun meine Frage: wird es irgendwelche Tutorials geben die z.B. erklären wie ich Landschaften und ähnliches mit Hilfe deiner Unit erschaffen kann? Oder bin ich jetzt falsch... ich hab nämlich nicht viel Ahnung von DirectX...

schmorbraten 28. Sep 2004 21:33

Re: Re: Leichter Zugriff auf DirectX durch Kapselung
 
Liste der Anhänge anzeigen (Anzahl: 2)
Nun, also für Anfänger in Sachen DirectX empfehle ich gerne SelfDXD auf http://www.minfos.de. Im Moment schreibe ich noch an der beigefügten Hilfe, die enthält zusammen mit den beigefügten Beispielen einige wertvolle Tipps.

Ob meine Unit zum Spiele-Programmieren geeignet ist, kann ich so nicht sagen, da ich nicht aus dieser Ecke komme. Für den Anfang sollte es zumindest reichen und Dir eine Menge Arbeit ersparen. Zumindest gibt es ein Objekt TxorDXIndexedPolygon, welches 3D-Punkte speichert und Dreiecke aus diesen Punkten zeichnet. Ebenso ein Objekt TxorDXTexture zum Laden von Texturen. Das Mappen von Texturen auf Polygons ist in der Hilfe erklärt (Thema Blending und VertexFormat: TxorDXVertexTexture).

Habe mal so im Schnellverfahren ein kleines Beispiel "Map" programmiert. Mit einem Untergrund und Psycho-Pitty. Siehe Anhang.

Viel Erfolg.
xor

negaH 28. Sep 2004 21:48

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Ich verstehe aber nicht warum du die Interfaces, eg. COM Objecte in Delphi Objecte kapselst. Somit muß ein Programmierer wierderum selber darauf achten das einmal allozierte Objecte auch manuell freigegeben werden. Cleverer wäre es gewesen direkt die Interfaces/COM Objecte zu benutzen, da dann das delphi-integrierte referncecounting greift und somit der Programmierer sich nicht mehr um die Allokation und Freigabe der Objecte kümmern müsste. Kurz geagt: meiner Meinung nach wird durch die Kapselung der DirectX COM-Interfaces in Delphi Objecte der Vorteil des DirectX wieder zunichte gemacht.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr.
Seite 1 von 3  1 23      

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