Skip to content
< All Topics

Static : RigidPart

Static allows a higher complexity level for 3D models, meaning it loads all materials on an object and recreates it as it was created in the 3D design software.
This is particularly relevant for Parts in Experior – such as conveyor belts, machinery, sensors and custom graphical objects – which are usually more complex than a single box-shaped Load variation. It should be noted that some models – such as a Conveyor belt – is actually a collection of different simpler model shapes stitched together rather than one mesh.
Models deriving from Static relates to models that either applies forces to other 3D model objects (conveyors), or models that are static in the scenery. A conveyor applies forces to Loads for instance, whereas a model of a stacked shelf, or a man, can be placed for illustrative purposes or achieving completeness of the Experior 3D model compared to the real world. Most importantly, Static models are not affected by a gravity force.
Static RigidPart models are typically added to Assemblies.
The collection below shows examples of models imported by classes deriving from Static.

Methods and Properties

Static implements physics related properties and methods, as well as overriding some of the basic definitions from RigidPart.
Note: We are working on creating a complete list which can be found in the API Static documentation.
The following physics related concepts are implemented:
  • CreateActor()
    • NVIDIA Physics core concept, defining an actor that behaves based on physics. A Static Part is added as an actor.
    • A new actor is created each time (in an UpdateActor() method) a property value that affects its functional configuration is changed, such as size or rigid shape. This method is called from a model class which derives from Static.
  • Kinematic related methods
    • A Kinematic = true actor will act as if it has infinite mass, which means it can push regular non-kinematic dynamic actors away, but cannot be pushed back itself. Secondly, if movement is intended for the part, the programmer must define the actor’s movement each time step, which can be useful if it is desirable that the object should follow a specific pre-defined path.
    • Static Parts are instantiated as Kinematic = true, which provides a need for defining methods that handles transformations (TransformActor()).
  • Rigid – matters in defining how the actor behaves when collisions occur. Also defines how precise the collision should be (as in how closely collision detection point matches point on the mesh) – this is also a question of performance, where rigid body shape complexity increases performance cost.
    • Rigid body shape – has the following options:
      • None
      • Box (Default)
      • Rounded
      • Dice
      • Sphere
      • Convex
  • Friction (override) & new methods
    • Enable/Disable() Friction methods can be called to set a Part’s friction coefficient on with its coefficient value or disable entirely.
      • (Physics Engine) For instance, Conveyor belts can have motors attached, where it can be useful to entirely disable friction when a motor is started and instead handle a Load’s movement along the Conveyor in a consistent linear manner. Similarly, when the motor stops, friction is enabled once again to stop the Load’s movement along the Conveyor.
  • Collide()
    • Boolean used to update simulation parameters if the Static Part collided with a Load Part
General related concepts that are implemented:
  • Attach()/UnAttach()
    • Methods related to attaching loads to a Static model, such as a robot picker with a magnet. Takes care of positioning/orientation of the attached loads.
  • Lock/Unlock – Lock/Unlock the Part’s position in Experior.
  • (Bool) Rigid – Get/Set whether the Static Part is a Rigid, which it does not necessarily have to be. If the 3D model imported is for illustration purposes, it does not need to behave with physics related functionality.

Adding a Static Model Part to an Assembly

The following code example demonstrates a code excerpt on how a Static model Part is added to an Assembly in Experior, based on the Curve Assembly found in the Conveyor Catalog and corresponding CurveConveyorBelt Part to add. 
Note: This excerpt is only a fraction of the full Curve Assembly implementation and should be considered as such, meaning the code snippets will not fully produce the illustrated example.
using Experior.Core.Parts; // Needed for ConveyorCurveBelt reference
using Experior.Core.Mathematics; // Needed for Trigonometry reference
using Experior.Interfaces; // Needed for Coefficient reference
using Experior.Core.Assemblies; // Needed for Assembly reference

public class Curve : Assembly
{
    private ConveyorCurveBelt curveBelt;
    
    public Curve(CurveInfo info) : base(info)
    {
        if(info.friction == null)
        {
            info.friction = new Experior.Core.Parts.Friction();
            info.friction.Coefficient = Coefficients.Sticky;
        }
    
        curveBelt = new ConveyorCurveBelt(true);
        curveBelt.Radius = info.radius;
        curveBelt.Width = info.width;
        curveBelt.Angle = Trigonometry.Rad2Angle(info.angle);
        curveBelt.Friction = info.friction;
        curveBelt.Rigid = true;
        curveBelt.Color = info.surfacecolor;
        
        Add(curveBelt);
    }
}
(Full) Curve conveyor belt model loaded into Experior.
A simpler example taken from the DeveloperSamples catalog, shows the most basic method of adding a new RigidPart Box to an Assembly, as demonstrated below.
DeveloperSamples Sample2 Assembly placed in Experior
Sample2 Assembly placed in Experior, containing part1 (Blue Box) and part2 (Red Box).
using Experiore.Core.Assemblies; // Needed for Assembly / AssemblyInfo reference
using Experior.Core.Parts; // needed for RigidPart/Box reference
using System.Windows.Media; // Needed for Colors reference
using System.Numerics; // Needed for Vector3 reference

public class Sample2 : Assembly
{
    private RigidPart part1, part2;
    
    // Constructor
    public Sample2(AssemblyInfo info) : base(info)
    {
        // Add a new RigidPart Box
        // Color = Blue
        // Dimensions = (x - length: 0.5m, y - height: 0.5m, z - width: 0.5m)
        // Local position = (x: 0, y: 2, z: 0)
        part1 = Add(new Box(Colors.Blue, 0.5f, 0.5f, 0.5f), new Vector3(0, 2, 0));
        part2 = Add(new Box(Colors.Red, 0.5f, 0.5f, 0.5f), new Vector3(0, 0, 0));
    }
}