Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra 2D]PhysicalTriangleSprite (https://www.delphipraxis.net/125546-%5Bandorra-2d%5Dphysicaltrianglesprite.html)

bigben37 8. Dez 2008 11:57


[Andorra 2D]PhysicalTriangleSprite
 
Hallo DP, ich brauche für mein Projekt ein PhysicalSprite in Form von einem Dreieck.

Ich habe mir die Constructors(eigentlich ja die Prozedur "InitializeShape") von TPhysicalBoxSprite und TPhysicalCylinderSprite angeschaut und habe entdeckt, dass sich diese beiden Prozeduren nicht unterscheiden, bis auf diese Zeile:
Delphi-Quellcode:
//TPhysicalCylinderSprite
  Construct := TPhysicalCylinderConstruct.Create(Physics);
//TPhysicalBoxSprite
  Construct := TPhysicalBoxConstruct.Create(Physics);
In beiden InitializeShape-Prozeduren wird das Construct so gefüllt;
Delphi-Quellcode:
Construct.CreateConstruct(Data);
Also hab ich meine TPhysicalTriangleSprite-Klasse und die TPhysicalTriangleConstruct-Klasse geschrieben.

Das einzig wichtige ist nur die CreateConstruct-Funktion, die ich so geschrieben habe (ziemlich gleich wie die vom Box-Sprite):
Delphi-Quellcode:
procedure TPhysicalTriangleConstruct.CreateConstruct(
  AData: TPhysicalConstructData);
var
  Collision:PNewtonCollision;
  Inertia:TAdVector3;
begin
  if AData is TPhysicalSimpleData then
  begin
    with AData as TPhysicalSimpleData do
    begin
      Collision := NewtonCreateCone(Parent.NewtonWorld, Width, Height, nil);
      NewtonBody := NewtonCreateBody(Parent.NewtonWorld, Collision);
      NewtonReleaseCollision(Parent.NewtonWorld, Collision);

      with Inertia do
      begin
        x := Mass * (sqr(Height) + 10000)     / 12;
        y := Mass * (sqr(Width) + 10000)      / 12;
        z := Mass * (sqr(Width) + sqr(Height)) / 12;
        NewtonBodySetMassMatrix(NewtonBody, Mass, x, y, z);
      end;

      NewtonBodySetForceAndTorqueCallback(NewtonBody, ForceAndTorqueCallback);
    end;
  end;
end;
Nun funktioniert das ganze nicht so, wie ich will. Es wird zwar compiliert, aber wenn ein Bild mit einem Dreieck dem Sprite zuweise, passt das Bild nicht zum Sprite(Kollision ist anders).
Ich denke, dass der Fehler im 2. With-Block (with Inertia do ...) liegt, weil ich nicht recht verstehe, was x, y und z zugewiesen werden soll. Bis jetzt habe ich den With-Block vom TPhysicalBoxConstruct übernommen.

Weis jemand, wie man ein PhysicalTriangle macht?

MFG, Benjamin

bigben37 16. Dez 2008 17:52

Re: [Andorra 2D]PhysicalTriangleSprite
 
*push*
Weis wirklich niemand weiter? Ich auch nicht! :wall:

Oder ist das überhaupt nicht möglich? :gruebel:

bigben37 28. Dez 2008 22:43

Re: [Andorra 2D]PhysicalTriangleSprite
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe einen kleinen Fortschritt gemacht: Das Dreieck ist jetzt einigermaßen stabil, nur die Textur ist ein bisschen zu klein. Also die anderen Physicalsprites kollidieren noch ausßerhalb der Textur (im Anhang ist ein Bild, mit dem man das besser zeigen kann. Die grünen Linien sind die Grenzen des Dreiecks, an denen die blauen Bälle kollidieren)

Der Quelltext sieht jetzt so aus:
Delphi-Quellcode:
procedure TPhysicalTriangleConstruct.CreateConstruct(
  AData: TPhysicalConstructData);
var
  Collision:PNewtonCollision;
  Inertia:TAdVector3;
  Mat1:TAdMatrix;
begin
  if AData is TPhysicalSimpleData then
  begin
    with AData as TPhysicalSimpleData do
    begin
      Mat1 := AdMatrix_Rotation(0, 0 ,135 * Pi / 180);

      Collision := NewtonCreateCone(Parent.NewtonWorld, Width, Height, @mat1[0,0]);
      NewtonBody := NewtonCreateBody(Parent.NewtonWorld, Collision);
      NewtonReleaseCollision(Parent.NewtonWorld, Collision);

      with Inertia do
      begin
        x := Mass * (sqr(Height) + 10000)     / 12;
        y := Mass * (sqr(Width) + 10000)      / 12;
        z := Mass * (sqr(Width) + sqr(Height)) / 12;
        NewtonBodySetMassMatrix(NewtonBody, Mass, x, y, z);
      end;

      NewtonBodySetForceAndTorqueCallback(NewtonBody, ForceAndTorqueCallback);
    end;
  end;
end;


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