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