📄 oxnewtondynamicmesh.pas
字号:
procedure TOXNewtonDynMesh.SetConcretX( const val: Float );
begin
FConcretX:= val;
SetMassValues;
end;
// SetConcretY //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetConcretY( const val: Float );
begin
FConcretY:= val;
SetMassValues;
end;
// SetConcretZ //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetConcretZ( const val: Float );
begin
FConcretZ:= val;
SetMassValues;
end;
// SetInertiaX //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetInertiaX( const val: Float );
begin
FInertiaX:= val;
SetMassValues;
end;
// SetInertiaY //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetInertiaY( const val: Float );
begin
FInertiaY:= val;
SetMassValues;
end;
// SetInertiaZ //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetInertiaZ( const val: Float );
begin
FInertiaZ:= val;
SetMassValues;
end;
// SetOriginX //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetOriginX( const val: Float );
begin
FOriginX:= val;
SetMassValues;
end;
// SetOriginY //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetOriginY( const val: Float );
begin
FOriginY:= val;
SetMassValues;
end;
// SetOriginZ //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetOriginZ( const val: Float );
begin
FOriginZ:= val;
SetMassValues;
end;
// SetAngularDampingX //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetAngularDampingX( const val: Float );
var DamVec: TOXVector3;
begin
FAngularDampingX:= val;
DamVec:= oxV3Make( FAngularDampingX, FAngularDampingY, FAngularDampingZ );
if FActived then
NewtonBodySetAngularDamping( FBody, @DamVec[0] );
end;
// SetAngularDampingY //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetAngularDampingY( const val: Float );
var DamVec: TOXVector3;
begin
FAngularDampingY:= val;
DamVec:= oxV3Make( FAngularDampingX, FAngularDampingY, FAngularDampingZ );
if FActived then
NewtonBodySetAngularDamping( FBody, @DamVec[0] );
end;
// SetAngularDampingZ //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetAngularDampingZ( const val: Float );
var DamVec: TOXVector3;
begin
FAngularDampingZ:= val;
DamVec:= oxV3Make( FAngularDampingX, FAngularDampingY, FAngularDampingZ );
if FActived then
NewtonBodySetAngularDamping( FBody, @DamVec[0] );
end;
// InitNewton //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.InitNewton;
var
mTriangles: TAffineVectorList;
vArray: array of TOXVector3;
i: integer;
begin
FManager:= TOXNewtonManager(Scene);
if FActived or ( FManager = nil ) then Exit;
if ( FPathFile <> '' ) then begin
SetCurrentDir(FPathFile);
LoadFromFile(FPathFile);
SetCurrentDir(ExtractFilePath(Application.ExeName));
end;
mTriangles:= MeshObjects.ExtractTriangles;
mTriangles.Scale( Scale.AsAffineVector );
SetLength( vArray, mTriangles.Count );
for i:= 0 to mTriangles.Count -1 do vArray[i]:= oxV3FToV3D( mTriangles.List[i] );
FCollision:= NewtonCreateConvexHull( FManager.World, mTriangles.Count,
@vArray[0], SizeOf( TOXVector3 ), nil );
mTriangles.Free;
SetLength( vArray, 0 );
oxDynMeshConvexHull( self );
FBody:= NewtonCreateBody( FManager.World, FCollision );
NewtonBodySetUserData( FBody, Self );
oxPSetInitTransform( FBody, Self );
if FContinuousCollisionMode then
NewtonBodySetContinuousCollisionMode( FBody, 1 ) else
NewtonBodySetContinuousCollisionMode( FBody, 0 );
if FManager.WorldMatrialCustom then begin
FContactID:= FManager.WorldDefaultMaterialID;
oxSetObjectMaterial( FBody );
end;
if Assigned( FOnCustomMass ) then
FOnCustomMass( FMass, FOriginX, FOriginY, FOriginZ, FInertiaX, FInertiaY, FInertiaZ )
else
oxMeshSetMass( FBody, FMass, FInertiaX, FInertiaY, FInertiaZ,
FOriginX, FOriginY, FOriginZ,
FConcretX, FConcretY, FConcretZ );
NewtonBodySetTransformCallback( FBody, @oxPSetTransform );
NewtonBodySetForceAndTorqueCallBack( FBody, @oxObjectPhysicsApplyForceAndTorque );
if FAutoFreeze then begin
NewtonBodySetAutoFreeze( FBody, 1 );
end else begin
NewtonBodySetAutoFreeze( FBody, 0 );
NewtonWorldUnfreezeBody( FManager.World, FBody );
end;
NewtonReleaseCollision( FManager.World, FCollision );
NewtonBodySetFreezeTreshold( FBody, FFreezeSpeedMag2, FFreezeOmegaMag2, FFreezeFramesCount );
FManager.AddLog( 'Dynamic Mesh Name: '+Name, 1, ':Info Object' );
FManager.AddLog( Name + ' InitNewton.', 1, ':Info Object' );
FActived:= True;
SetLinearDamping( FLinearDamping );
SetAngularDampingX( FAngularDampingX );
SetAngularDampingY( FAngularDampingY );
SetAngularDampingZ( FAngularDampingZ );
end;
// SetMass //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetMass( const val: Float );
begin
if ( val <> FMass ) then
FMass:= val;
if FActived then if Assigned( FOnCustomMass ) then
FOnCustomMass( FMass, FOriginX, FOriginY, FOriginZ,
FInertiaX, FInertiaY, FInertiaZ )
else
oxMeshSetMass( FBody, FMass, FInertiaX, FInertiaY, FInertiaZ,
FOriginX, FOriginY, FOriginZ,
FConcretX, FConcretY, FConcretZ );
end;
// DoProgress //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
procedure TOXNewtonDynMesh.DoProgress( const progressTime: TProgressTimes );
begin
inherited;
if FActived then begin
if Assigned( FOnStepRender ) then
FOnStepRender( progressTime.deltaTime, progressTime.newTime );
end;
end;
// Destroy //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel. //
{******************************************************************************}
destructor TOXNewtonDynMesh.Destroy;
begin
if FActived and assigned( FBody ) then begin
if ( not ( csDesigning in ComponentState ) ) then
if Name = '' then FManager.AddLog( ClassName + ' destroyed.', 1, ':Info Object' )
else FManager.AddLog( Name + ' destroyed.', 1, ':Info Object' );
FActived:= False;
NewtonBodySetTransformCallback( FBody, nil );
NewtonBodySetForceAndTorqueCallBack( FBody, nil );
NewtonDestroyBody( FManager.World, FBody );
end;
inherited destroy;
end;
// TOXNewtonManager //
{******************************************************************************}
{$D '[15-9-2007]: TOXNewtonManager v1.55 by Dave Gravel under MPL-1.1 license.'}
{******************************************************************************}
initialization
RegisterClasses( [ TOXNewtonDynMesh ] );
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -