How do i find local axis in shape?

Dear Sir!

How do i find local axis in shape?

I would like to do display local axis of shape when select shape.

But I cannot find local axis of shape.

Please help.

Thanks in advanced.

Olivier Coma's picture

Hi,

If you want to retrieve an axis from the principal properties of inertia of a shape, you can use the following code :

//S is a solid gp_Ax2 Position; GProp_GProps System; BRepGProp::VolumeProperties(S, System); GProp_PrincipalProps Pp=System.PrincipalProperties(); Position.SetLocation(System.CentreOfMass()); Position.SetDirection(Pp.FirstAxisOfInertia()); Position.SetXDirection(Pp.SecondAxisOfInertia());

I hope this code will help you.

Benedicte Martin's picture

hi,

did you test your code when your shape is a cylinder? Because, when a shape is a cylinder, the first axis of inertia is not the axis of rotation !!!

theShape is a solid, a cylinder GProp_GProps aGProperties; BRepGProp::SurfaceProperties(theShape, aGProperties); GProp_PrincipalProps aPrincipalProps = aGProperties.PrincipalProperties(); gp_Vec aVec; aVec = aPrincipalProps.FirstAxisOfInertia();

I ask u the same question when u use a face. In fact, when u use a cylindrical face, the first axis of inertia is not the axis of rotation !!

theShape is a cylindrical face GProp_GProps aGProperties; BRepGProp::SurfaceProperties(theShape, aGProperties); GProp_PrincipalProps aPrincipalProps = aGProperties.PrincipalProperties(); gp_Vec aVec; aVec = aPrincipalProps.FirstAxisOfInertia();

Perhaps, I make a mistake when i use this method. Can u help me ?

Olivier Coma's picture

Hi,

I agreed that when the shape is a cylinder, the first axis of inertia is not necessarily the axis of rotation (Z) but it is just normal.

If you want to get a trihedron for a solid, you have to use BRepGProp::VolumeProperties. If you want to find the axis of rotation of a cylindrical face, using BRepGProp::SurfaceProperties is not a good solution. I use the following code :

//F is a TopoDS_Face BRepAdaptor_Surface AF(F); if (AF.GetType()!=GeomAbs_Cylinder) return; gp_Cylinder C=AF.Surface().Cylinder(); C.Transform(AF.Trsf()); gp_Dir Z=C.Axis().Direction();

Benedicte Martin's picture

hi,

in fact, the axis of rotation of a cylinder is the third axis of inertia.

thanks for u help.

ps: i knew your method to find the axis of rotation

Olivier Coma's picture

Hi,

I am sorry but what you have just wroten is false. Principal inertia axes are the eigen vectors of the inertia matrix. First, second and third principal axis are respectively those relative to the first, second and third eigen value of the inertia matrix (that is symmetric and orthogonal). More, eigen values (that are the principal moments of inertia) are ordered by decreasing values.

For a cylinder, two eigen values have the same value, since a cylinder has a rotational symetry, and the third eigen value can be either inferior or superior to the two others, depending on the ratio l/d of the cylinder. Tipically, if a cylinder is a disc (l/d <<), the axis of rotation is the first principal axis of inertia. But if the cylinder is long (l/d >>), the axis of rotation is the third one.

Finally, if the cylinder has a small feature on its shape, so that it is not still symmetric, all these considerations become false. None of the principal axes is the axis of the cylinder.