![]() |
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.
![]() |
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. |
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:
(ich habe einfach ein beispiel von dir genommen und es verändert *G*)
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; 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 !!! |
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:
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
//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 ![]() 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. |
Re: Leichter Zugriff auf DirectX durch Kapselung
danke, werde ich gleich mal testen !!!
|
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 ! |
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 |
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... |
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
![]() 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 |
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. |
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