AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Leichter Zugriff auf DirectX durch Kapselung
Thema durchsuchen
Ansicht
Themen-Optionen

Leichter Zugriff auf DirectX durch Kapselung

Ein Thema von schmorbraten · begonnen am 13. Aug 2004 · letzter Beitrag vom 24. Jun 2005
Antwort Antwort
Seite 1 von 3  1 23      
schmorbraten
Registriert seit: 11. Mär 2004
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
Angehängte Dateien
Dateityp: zip xordx8_187.zip (1,41 MB, 53x aufgerufen)
 
6. Sep 2004, 11:50
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

 
FreePascal / Lazarus
 
#3
  Alt 18. Sep 2004, 18:07
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 !!!
Michael Springwald
  Mit Zitat antworten Zitat
schmorbraten
 
#4
  Alt 19. Sep 2004, 19:30
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.
  Mit Zitat antworten Zitat
mimi

 
FreePascal / Lazarus
 
#5
  Alt 25. Sep 2004, 18:04
danke, werde ich gleich mal testen !!!
Michael Springwald
  Mit Zitat antworten Zitat
mimi

 
FreePascal / Lazarus
 
#6
  Alt 25. Sep 2004, 18:29
wie würdes du mehre objekte verwalten ?
ich habe mir dafür immer ein record erzeugt und bentutz !
Michael Springwald
  Mit Zitat antworten Zitat
schmorbraten
 
#7
  Alt 26. Sep 2004, 21:16
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
  Mit Zitat antworten Zitat
Maa83

 
Delphi 10.3 Rio
 
#8
  Alt 27. Sep 2004, 13:38
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...
Martin
  Mit Zitat antworten Zitat
schmorbraten
 
#9
  Alt 28. Sep 2004, 21:33
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
Miniaturansicht angehängter Grafiken
psychopitty.jpg  
Angehängte Dateien
Dateityp: zip map.zip (15,4 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#10
  Alt 28. Sep 2004, 21:48
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 15:07 Uhr.
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