A place to discuss everything related to Newton Dynamics.
Moderators: Sascha Willems, walaber
by Leadwerks » Thu Oct 30, 2008 10:34 pm
Here's the code. I think a built-in function would help a lot of people:
- Code: Select all
Method AddForceAtPosition(force:TVec3,position:TVec3)
Local torque:TVec3
Local r:TVec3
r=position.minus(mat.translation())
torque=r.cross(force)
torque.x=Degrees(torque.x)
torque.y=Degrees(torque.y)
torque.z=Degrees(torque.z)
Self.force=Self.force.plus(force)
fx=Self.force.x
fy=Self.force.y
fz=Self.force.z
Self.torque=Self.torque.plus(torque)
tx=Self.torque.x
ty=Self.torque.y
tz=Self.torque.z
Unfreeze()
EndMethod
-
Leadwerks
-
- Posts: 569
- Joined: Fri Oct 27, 2006 2:54 pm
by JernejL » Fri Oct 31, 2008 8:59 am
- Code: Select all
function GetPointGlobalVelocity(const body: PNewtonBody; Point: TVector): TVector;
function GetPointLocalVelocity(const body: PNewtonBody; Point: TVector): TVector;
procedure AddPointGlobalForce(const body: PNewtonBody; PrevBodyMatrix: pointer; Force, Point: TVector);
procedure AddPointLocalForce(const body: PNewtonBody; Force, Point: TVector);
- Code: Select all
function MatrixRotateVector(vec: TVector; m: Tmatrix): TVector; // tested, works.
begin
Result[0] := vec[0] * m[0, 0] + vec[1] * m[1, 0] + vec[2] * m[2, 0];
Result[1] := vec[0] * m[0, 1] + vec[1] * m[1, 1] + vec[2] * m[2, 1];
Result[2] := vec[0] * m[0, 2] + vec[1] * m[1, 2] + vec[2] * m[2, 2];
end;
function MatrixUNRotateVector(vec: TVector; m: Tmatrix): TVector; // tested, works.
begin
Result[0] := vec[0] * m[0][0] + vec[1] * m[0][1] + vec[2] * m[0][2];
Result[1] := vec[0] * m[1][0] + vec[1] * m[1][1] + vec[2] * m[1][2];
Result[2] := vec[0] * m[2][0] + vec[1] * m[2][1] + vec[2] * m[2][2];
end;
function MatrixTransformVector(vec: TVector; m: Tmatrix): TVector; // tested, works.
begin
Result[0] := vec[0] * m[0][0] + vec[1] * m[1][0] + vec[2] * m[2][0] + m[3][0];
Result[1] := vec[0] * m[0][1] + vec[1] * m[1][1] + vec[2] * m[2][1] + m[3][1];
Result[2] := vec[0] * m[0][2] + vec[1] * m[1][2] + vec[2] * m[2][2] + m[3][2];
end;
// retrieves body's velocity at specific point in global space
function GetPointGlobalVelocity(const body: PNewtonBody; Point: TVector): TVector;
var
velocity, omega: TVector;
begin
NewtonBodyGetVelocity(body, @velocity);
NewtonBodyGetOmega(body, @omega);
Result := VectorAdd(velocity, VectorCrossProduct(omega, point));
end;
// retrieves body's velocity at specific point in local space
function GetPointLocalVelocity(const body: PNewtonBody; Point: TVector): TVector;
var
bodymatrix: Tmatrix;
begin
NewtonBodyGetMatrix(body, @bodymatrix);
Result := GetPointGlobalVelocity(body, MatrixRotateVector(Point, bodymatrix));
Result := MatrixUNRotateVector(Result, bodymatrix);
end;
// adds force to body at a specified point in global space
procedure AddPointGlobalForce(const body: PNewtonBody; PrevBodyMatrix: pointer; Force, Point: TVector);
var
GlobalForce: TVector;
bodymatrix: Tmatrix;
Torque: TVector;
begin
if PrevBodyMatrix = nil then
NewtonBodyGetMatrix(body, @bodymatrix)
else
move(PrevBodyMatrix^, bodymatrix, sizeof(Tmatrix));
GlobalForce[0] := Point[0] - bodymatrix[3][0];
GlobalForce[1] := Point[1] - bodymatrix[3][1];
GlobalForce[2] := Point[2] - bodymatrix[3][2];
Torque := VectorCrossProduct(GlobalForce, Force);
NewtonBodyAddForce(body, @Force[0]);
NewtonBodyAddTorque(body, @Torque[0]);
end;
// adds force to body at a specified point in local space
procedure AddPointLocalForce(const body: PNewtonBody; Force, Point: TVector);
var
GlobalForce, GlobalPoint: TVector;
bodymatrix: Tmatrix;
begin
NewtonBodyGetMatrix(body, @bodymatrix);
GlobalForce := MatrixRotateVector(Force, bodymatrix);
GlobalPoint := MatrixTransformVector(Point, bodymatrix);
AddPointGlobalForce(body, @bodymatrix, GlobalForce, GlobalPoint);
end;
Same functionality in delphi + additional functions like getlocalvelocity and some math routines.
-
JernejL
-
- Posts: 1578
- Joined: Mon Dec 06, 2004 2:00 pm
- Location: Slovenia
-
Return to General Discussion
Who is online
Users browsing this forum: No registered users and 15 guests