AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [Andorra 2D]PhysicalTriangleSprite
Thema durchsuchen
Ansicht
Themen-Optionen

[Andorra 2D]PhysicalTriangleSprite

Ein Thema von bigben37 · begonnen am 8. Dez 2008 · letzter Beitrag vom 28. Dez 2008
Antwort Antwort
Benutzerbild von bigben37
bigben37

Registriert seit: 19. Dez 2007
Ort: Freiburg
116 Beiträge
 
Delphi 2009 Professional
 
#1

[Andorra 2D]PhysicalTriangleSprite

  Alt 8. Dez 2008, 12:57
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;
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
Benjamin
Optimismus ist nur ein Mangel an Information
  Mit Zitat antworten Zitat
Benutzerbild von bigben37
bigben37

Registriert seit: 19. Dez 2007
Ort: Freiburg
116 Beiträge
 
Delphi 2009 Professional
 
#2

Re: [Andorra 2D]PhysicalTriangleSprite

  Alt 16. Dez 2008, 18:52
*push*
Weis wirklich niemand weiter? Ich auch nicht!

Oder ist das überhaupt nicht möglich?
Benjamin
Optimismus ist nur ein Mangel an Information
  Mit Zitat antworten Zitat
Benutzerbild von bigben37
bigben37

Registriert seit: 19. Dez 2007
Ort: Freiburg
116 Beiträge
 
Delphi 2009 Professional
 
#3

Re: [Andorra 2D]PhysicalTriangleSprite

  Alt 28. Dez 2008, 23:43
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;
Miniaturansicht angehängter Grafiken
dreieck_620.jpg  
Benjamin
Optimismus ist nur ein Mangel an Information
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:55 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