Delphi-PRAXiS

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

schmorbraten 1. Okt 2004 08:48

Re:Re: Leichter Zugriff auf DirectX durch Kapselung
 
Hallo,
ich habe mich an SelfDXD gehalten, wo vorbildlich alle erzeugten Interfaces am Ende auch wieder nil gesetzt werden (was ein Release für das Interface auslöst). Genau das passiert in meinen Destroy-Methoden. Wenn beim Reference-Counting das COM-Objekt automatisch frei gegeben wird, hast Du natürlich recht. Allerdings hat man dann keine Kontrolle über den Zeitpunkt. Zudem entwarf ich die Unit, um den doch recht komplexen Zugriff auf die Interfaces zu vereinfachen. Eine Objekt-Hierachy schien mir da angebracht, zumal meine Objekte auch einiges an eigener (objektorientierter) Funktionalität mitbringen.

Nun, das Thema COM-Objekte ist für mich noch etwas gräulich, ich hoffe, Dich nicht falsch verstanden zu haben - andernfalls meld Dich nochmal. Es gibt bestimmt noch einiges zu verbessern. Den Vorteil von DirectX sehe ich (durch erzwungen manuelles Freigeben) nicht gleich zunichte gemacht, den der besteht doch hauptsächlich aus der Hardware-Zugriffsgeschwindigkeit, was durch eine Kapselung doch nicht wirklich beeinträchtigt wird, oder?

Viele Grüße
xor

mimi 19. Jun 2005 13:16

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Liste der Anhänge anzeigen (Anzahl: 2)
ich wollte ein einfaches programm machen ein bahn die du von oben siehst und eine kugel drauf die sich begt, dabei ist mir folgendes aufgefallen(ersteinmal)
sobalt ich die z position veränder(also nach vorne oder nach hinten gehen möchte) wird auch auto. x und y veränedert
folgende qullcode habe ich dafür geschrieben:
Delphi-Quellcode:
//creation
  Scene := TxorDXScene.Create(Handle);
  Camera := TxorDXCamera.Create(Scene);
  Rect  := TxorDXRect.Create(Scene, 100, 100, 100, 2); //set standard coordinates and colors
  Ball  := TxorDXBall.Create(Scene, 60, 30, 0.4); //set standard coordinates and colors
  Ball.MonoChrom(clRed);
  Ball.Move(33,-22.8,-52);

  Rect.RotateX(180);
  Rect.RotateY(0.9);
  Rect.RotateZ(-0.6);
  Scene.SetBackgroundColor(0,0,0,0);

  Scene.AutoLightOnOff:=True;
  Scene.CreateBuffers;
  //start
// lingx/rechts; nähre dran weiter weg,
  Camera.Move(32.5,-26,-50);
  Camera.SetStandard;
  Camera.Activate;
  Scene.StartLooping(Draw); //loop drawing routine
und dann möchte ich noch genre das sich die kugel nach hinten bewegt und die kamera soll folgen in einen konstanten abstandt naja ich habe daüfr folgenden code in der Draw procedure geschrieben:
Delphi-Quellcode:
  Scene.Clear;
  Rect.Insert;

  Rect.Draw;
  Ball.Insert;
  Ball.Move(0,0,0.1);
  Ball.Draw;
im anhang gibt die exe und ein bild

Die Muhkuh 19. Jun 2005 13:49

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Hi,

das ist ja mal spitzenmäßg :thumb: .

Das ist echt viel einfacher und cooler als DelphiX.

Ich hab mir das jetzt gerade mal angesehen und bin echt erstaunt, wie man mit wenig Code schon was kleines Animieren kann. (Rotate halt :mrgreen: ).

Eine Frage hab ich trotzdem. Wie kann ich eine Kollision überprüfen?

nailor 19. Jun 2005 13:58

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Zitat:

Zitat von Spider
Eine Frage hab ich trotzdem. Wie kann ich eine Kollision überprüfen?

das würde ich ganz strikt von der grafik trennen und dann bei google/hier im forum/sonstwo nach sachen wie kollision erkennung detection... suchen

schmorbraten 19. Jun 2005 21:13

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Hi Mimi,
habe leider zu wenig Zeit, um im Moment der Sache auf den Grund zu gehen. Wäre auch gut, wenn man Deinen Source downloaden könnte. Mir sind so ein paar Kleinigkeiten aufgefallen:
1. Vertausche diese beiden Zeilen, SetStandard könnte den Move beeinflussen.
Delphi-Quellcode:
  Camera.Move(32.5,-26,-50);
  Camera.SetStandard;
2. Eine Camera hat einen Positions- und einen Richtungsvektor. Benutze statt Move lieber MoveHoriz(d, xorDXCamId) oder dergleichen, so wirkt sich Dein Move auch auf diese Vektoren aus. Ein einfaches Move wirkt sich nur auf die Transformationsmatrix aus, was bei normalen Objekten auch ausreicht. Vereinfacht unterscheide ich immer Camera und Kameramann. MoveHoriz wirkt sich auf beide aus, Move nur auf die Kamera. Analog RotateY und RotateHoriz. Ein RotateY macht Sinn, wenn der Kameramann die Kamera die ganze Zeit verdreht halten soll, ich den Kameramann aber davon unabhängig "ganz normal" navigieren will.

3. Ansonsten fällt mir auf, dass Du die Camera nach rechts unten hinten verschiebst, aber weiterhin auf den Nullpunkt (LookAt-Vektor) schaust, also nach oben links vorne. Die Kugel verschiebst Du jetzt (nur) nach vorn und genau das sieht man doch auch in Deinem Programm oder?
Soll sich die Kugel in Blickrichtung wegbewegen, so verschiebe die Kugel in Richtung der Kamera, also etwas derart:
Delphi-Quellcode:
  TxorDXVector v := Camera.Direction;
  Ball.Move(v.x * 0.1, v.y * 0.1, v.z * 0.1);
Hi Spider,
xorDX8 ist konzipiert für die einfache und schnelle Benutzung von DirectX.
Kollisionserkennung ist nicht integriert. Kenne mich damit auch nicht richtig aus. Auf die Transformationsmatrizen der Objekte, Kamera und Welt(Scene) kannst Du jedoch zugreifen.
Viel Erfolg.

Gruß xor

Die Muhkuh 20. Jun 2005 07:42

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Zitat:

Zitat von schmorbraten
Hi Spider,
xorDX8 ist konzipiert für die einfache und schnelle Benutzung von DirectX.
Kollisionserkennung ist nicht integriert. Kenne mich damit auch nicht richtig aus. Auf die Transformationsmatrizen der Objekte, Kamera und Welt(Scene) kannst Du jedoch zugreifen.
Viel Erfolg.

Hi,

falls du das Projekt mal weiterentwickelst (was ich mir wünschen würde) und vllt. auf DirectX 9 umbaust, könntest du ja die Kollisionserkennung mit einbauen?

mimi 20. Jun 2005 09:24

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Liste der Anhänge anzeigen (Anzahl: 1)
das mit dem ball ist immer noch komisch: ich möchte in nach vorne bewegen, ich habe ihn jetzt mit
Ball.MoveCenter(True);
Zum Nullpukt versetzt und schreibe in der onDraw Funktion:
Delphi-Quellcode:
begin
  Scene.Clear;
  Rect.Insert;

  Rect.Draw;
  Ball.Insert;
  Ball.Move(0,0,1);

  Ball.Draw;
das mit dem v hatte ich getestet da saht man den ball nicht mehr.... und jetzt geht er nach hinten unten standt nach vorne.
ich möchte den ball nur nach vorne begen.

das beste währe wenn die camra im Konstant abstad zum obj gerichtet werden könnte z.b. die kamar sieht alles von oben und sobalt sich das obj bewegt soll sich die kamra auch bewegen.

ich werde auch zwischndurch mal wegen der collisions erkennung suchen, da gibt es bestimmt eine menge im internet.

Schreibst du die komponenten samlungn noch weiter ? wenn ja könntes du noch einige vereinfachungen machen:
Karama auf obj halten(wie bei GLScne)
und eine procedure die ein obejtk nur nach vorne nach hinten nach lings nach rechts nach unten und nach oben verschieben kann und nicht: wenn ich nur z ändenre gehe ich davon aus, das ich das obj nach vorne(+1) oder nach hinten(-1) verschiebe ist das richtig ? warum wird es nach unten geschoben ?
hier mal der gesammte qullcode(im anhang)

schmorbraten 20. Jun 2005 11:15

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Hi Spider,
bist herzlich eingeladen, mitzuhelfen ;-)
Werde es auf die Todo-Lsite nehmen, wird aber so schnell nicht werden.

Hi Mimi,
werde mir bei Gelegenheit den Source mal angucken, allerdings wird dies wohl einige Zeit benötigen.
Ansonsten sei noch gesagt, dass Du auch die Kamera moven musst, wenn der Abstand zum Objekt gleich bleiben soll. Mitunter macht es auch Sinn, Objekt und Kamera unbewegt zu lassen und statt dessen alle anderen Objekte entgegengesetzt zu bewegen.
Um nicht mit vorne, hinten usw. durcheinander zu kommen, empfehle ich die Kamera auf Position 0,0,-50 zu setzen und Blick auf 0,0,0.

Viele Grüße
Schmorbraten alias xor alias Sven

Die Muhkuh 20. Jun 2005 11:23

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Zitat:

Zitat von schmorbraten
Hi Spider,
bist herzlich eingeladen, mitzuhelfen ;-)
Werde es auf die Todo-Lsite nehmen, wird aber so schnell nicht werden.

Hi Sven,

danke, aber ich hab keinen Schimmer von DirectX. Falls Du ICQ hast, kannst du mich ja mal kontaktitieren, vllt. könnte ich ja was kleineres helfen.

Falls Du kein ICQ hast, dann halt per PN

mimi 20. Jun 2005 14:00

Re: Leichter Zugriff auf DirectX durch Kapselung
 
eins verstehe ich noch nicht so genau:
Blickpos ? Kamrapos ? ist das nicht ein und das selbe ?

Wenn ich die Kamra bewege ändert sich doch auch die blick richtung oder etwa nicht ?

Speedmaster 20. Jun 2005 15:10

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Zitat:

Zitat von mimi
eins verstehe ich noch nicht so genau:
Blickpos ? Kamrapos ? ist das nicht ein und das selbe ?

Wenn ich die Kamra bewege ändert sich doch auch die blick richtung oder etwa nicht ?

Nein, zumindestens bei meinen OpenGL Kenntnissen ist das nicht so( Ja, OpenGL <> DirectX ), die Position der Kamera hat nichts damit zu tun wohin es guckt. Stell dir das als ein Vertex vor, das sich verschiebt, aber nicht die Richtung ändert wo es hin ausgerichtet ist!

schmorbraten 20. Jun 2005 18:20

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Ja genau, es gibt die KameraPosition und die KameraBlickrichtung (Direction). Position + Direction = LookAt. Zusätzlich gibt es noch den Up-Vektor, der sagt wo oben ist (wenn man z.B. kopfüber hängt, zeigt der nach unten).

Achtung:
1. Wie oben aufgeführt muss man in xorDX8 noch zwischen Kamera und Kameramann unterscheiden. Position etc beziehen sich auf den Kameramann und sollten mit MoveHoriz, -vert, -forward, RotateHoriz, -vert, -around, MoveTo, SetPosition, SetDirection etc gesteuert werden. Benutzt man stattdessen Move, Rotate etc bezieht sich dies lediglich auf das Verhältnis zwischen Kameramann und Kamera, was normalerweise unnötig ist. Direction etc bleiben dabei unangetastet. Das macht nur Sinn, wenn ich den Kameramann wie Kamera dirigieren will, aber er die Kamera permanent verdreht halten soll oder dergleichen... (Man kann somit die gleichen Befehle auf zwei Kameras loslassen, wobei die eine aber nach hinten und die andere nach vorne guckt. Glaub ich jedenfalls.)

2. Ein weiterer Punkt ist inwiefern ich MoveHoriz ausführen will, d.h. soll die Horizontale Bewegung parallel zur Koordinaten-XY-Ebene passieren (xorDXcamID), oder möchte ich mich horizontal zur in der (geneigten) Blickebene bewegen (camHuman, Bsp. man läuft auf einer schrägen Wand, dann heißt horizontal parallel zur Wand, nicht zum Erdboden), oder heißt horizontal senkrecht zum Up-Vektor der Kamera.... Diesen Parameter kann man bei MoveHoriz übergeben. xorDXcamHuman spiegelt menschliches Verhalten wieder.

3. Der Unterschied zu FreeCam. Bei der FreeCam wird der UpVektor mit gedreht. So kann ein Flugzeug ein Looping fliegen. Eine normale Kamera, deren UpVektor kerzengrade nach oben zeigt, kann nie ganz direkt nach unten/oben gucken und so auch keine Loopings.

xor

mimi 23. Jun 2005 10:54

Re: Leichter Zugriff auf DirectX durch Kapselung
 
ich möchte letzendlich nur folgendes:
ich habe eine Kugel und eine Panel und die gugel ist ganz hinten am null punk und wie schaffe ich es jetzt das die kamra 1. auf die kugel gerichtet ist und zwar in einen Konstanten abstand und wenn ich das obj nach vorne schiebe muss die karama ja nach hinten gehen.
Wie schaffe ich das ?

barf00s 23. Jun 2005 11:58

Re: Leichter Zugriff auf DirectX durch Kapselung
 
falls ihr nen gescheites paper zu kollision sucht, hier findest ihrs

schmorbraten 24. Jun 2005 07:22

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Mimi,
habe das in xorDX8 mitgelieferte Bowling-Beispiel verändert. Ich hoffe, es hilft Dir.

Im wesentlichen sieht der Source so aus:
Delphi-Quellcode:
//repeated drawing routine
procedure TForm1.Draw(Sender: TObject);
const
  MoveZ: Single = 0.01;
begin
  Scene.Clear;

  GetKeyboard(MoveZ);

  //Move Ball and Camera forward/backward
  Ball.Move(0, 0, MoveZ);
  Camera.MoveForward(MoveZ, xorDXCamHuman);
  Camera.Activate;

  Grid.Insert;
  Grid.Draw;

  DrawMultiMaps;

  Ball.Insert;
  Ball.Draw;

end;
Viele Grüße
xor alias Schmorbraten

mimi 24. Jun 2005 09:32

Re: Leichter Zugriff auf DirectX durch Kapselung
 
als ich das Projekt complirt habe(dein beispiel) ist das Komplete windows abgestürzt.... daher werde ich dieses projekt lieber nicht mehr Testen*schade*
fürher lief das beispiel auf mein Rechner jetzt nicht mehr.... woran ist liegt weiß ich leider nicht da ich nicht windows neu installieren möchte.....

evlt. kannst du ja diesen "kleinen" bug finden und fixen *G*

schmorbraten 24. Jun 2005 15:23

Re: Leichter Zugriff auf DirectX durch Kapselung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Mimi,
also zwischen Windows abstürzen und neu installieren müssen gibts einen kleinen Unterschied.
Ein bischen Forscherarbeit solltest Du da schon reinstecken, also mal debuggen bis zur abstürzenden Stelle wäre nicht schlecht. Immerhin habe ich gestern dafür auch ein paar Abendstündchen geopfert. (Vielleicht auch den Bowling-Ordner löschen vorm Entpacken des neuen Bowling-Beispiels?)

Zudem lief das Projekt bei mir, ich kann Deinen Fehler also nur schwer buggen.
Ansonsten: Benutzt Du DirectX8 o.besser? Welches Delphi hast Du? Welches Windows?

Viele Grüße
xor

mimi 24. Jun 2005 18:39

Re: Leichter Zugriff auf DirectX durch Kapselung
 
ich nutze
Delphi7
habe
WinXp home
und habe DX9.0

ich hatte ja schon füher mit deine libg rumgespielt.
und da ist mir einbefehl aufgefallen der windows zum abstürzen bringt. nagut ich werde es einmal riskieren das xp abstürzt.... weil bis ich den rechner dann soweit wieder habe dauert das leider seine zeit....

mimi 24. Jun 2005 18:52

Re: Leichter Zugriff auf DirectX durch Kapselung
 
der 2.Versuch schlug fehl: ich habe alle anweisungen in der create procedure mit einem haltepunkt versehen und den draw modus auskometiert, ergbnis: delphi hat sich aufgehangen und das komplete windows auch.
eine möglichkeit habe ich noch:
hinter und vor jeder anweisung eine log funktion zu schreiben so sehre ich nach dem absturzt wenigens wie weit er gekommen ist und kann dir dann die anweisung nennen *G*


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