Siddharth,

You cannot mix 2D and 3D collision shapes.  If your mechanism is planar, all 
collision shapes must be 2D and lie in the same plane.
I pushed a Python demo illustrating the use of 2D collision shapes. See 
demo_MBS_collision_2d.py<https://github.com/projectchrono/chrono/blob/main/src/demos/python/mbs/demo_MBS_collision_2d.py>.

--Radu

P.S. Please post code with no background. The message below is difficult to 
read.

From: [email protected] <[email protected]> On Behalf 
Of Siddharth L
Sent: Tuesday, October 7, 2025 10:46 AM
To: ProjectChrono <[email protected]>
Subject: [chrono] 2D Collision not Working in Pychrono

Hi All,

I'm with simple two level MBD Mechanism, In that 2D Collision is not working.
I not sure it due bug or, I'm not handling it properly. Kindly help me to 
resolve this issue.

Code :
```
import pychrono.core as chrono
import pychrono.irrlicht as chronoirr

# --- SYSTEM & MATERIALS ---
sys = chrono.ChSystemNSC()
mat = chrono.ChContactMaterialNSC()
sys.SetGravitationalAcceleration(chrono.ChVector3d(0, 0, 0))

# --- KEY REFERENCE POINTS (GENERIC NAMES) ---
# BODY 1 (main rotating body)
body1_pivot = chrono.ChVector3d(0, 13.692, 0)
body1_armA_end = chrono.ChVector3d(0, -13.692, 0)
body1_armB_end = chrono.ChVector3d(-12.74229169, -25.36073728, 0)

# BODY 2 (secondary body)
body2_pivot = chrono.ChVector3d(1.40186, -22.50787380, 0)
body2_armA_end = chrono.ChVector3d(-11.27933961, 11.62809944, 0)
body2_armB_end = chrono.ChVector3d(5.64177978, -19.92728796, 0)

# --- STATIC REFERENCE BODY ---
staticbody = chrono.ChBody()
staticbody.SetFixed(True)
staticbody.SetPos(chrono.ChVector3d(0, 0, 0))
sys.Add(staticbody)
# --- BODY 1 SETUP ---
body1_axis_sys = chrono.ChFramed(chrono.ChCoordsysd(body1_pivot, chrono.QUNIT))

body1 = chrono.ChBody()
body1.SetPos(body1_axis_sys.GetPos())
body1.SetFixed(False)
body1.SetMass(1)
body1.SetInertiaXX(chrono.ChVector3d(1e3, 1e3, 1e3))
body1.EnableCollision(True)

# Collision shape on BODY 1 (a small cylinder located at armB end)
body1_contact_cyl = chrono.ChCollisionShapeCylinder(mat, 0.81823296, 0.1)
body1.AddCollisionShape(body1_contact_cyl, chrono.ChFramed(body1_armB_end, 
chrono.QUNIT))
sys.Add(body1)

# Visual cylinder at the same place
body1_vis_cyl = chrono.ChVisualShapeCylinder(0.81823296, 0.1)
body1.AddVisualShape(body1_vis_cyl, chrono.ChFramed(body1_armB_end, 
chrono.QUNIT))

# Visualize BODY 1 arms (lines from pivot-local origin to endpoints)
local_body1_armA_end = chrono.ChVector3d(0, -13.692, 0)
local_body1_armB_end = chrono.ChVector3d(-12.74229169, -25.36073728, 0)

body1_armA_visual = chrono.ChVisualShapeLine()
body1_armA_visual.SetColor(chrono.ChColor(0.1, 0.9, 0.1))
body1_armA_visual.SetLineGeometry(chrono.ChLineSegment(chrono.ChVector3d(0, 0, 
0), local_body1_armA_end))

body1_armB_visual = chrono.ChVisualShapeLine()
body1_armB_visual.SetColor(chrono.ChColor(0.1, 0.9, 0.1))
body1_armB_visual.SetLineGeometry(chrono.ChLineSegment(chrono.ChVector3d(0, 0, 
0), local_body1_armB_end))

body1.AddVisualShape(body1_armA_visual)
body1.AddVisualShape(body1_armB_visual)

# Revolute joint for BODY 1 at body1_pivot
body1_revolute = chrono.ChLinkLockRevolute()
mframe = chrono.ChFramed(body1_pivot, chrono.QUNIT)
body1_revolute.Initialize(body1, staticbody, mframe)
sys.Add(body1_revolute)
min_angle = 0 * chrono.CH_DEG_TO_RAD
max_angle = 270 * chrono.CH_DEG_TO_RAD
body1_revolute.LimitRz().SetActive(True)
body1_revolute.LimitRz().SetMin(min_angle)
body1_revolute.LimitRz().SetMax(max_angle)

# Applied force/torque on BODY 1
body1_force = chrono.ChForce()
body1.AddForce(body1_force)
body1_force.SetMode(chrono.ChForce.FORCE)
body1_force.SetDir(chrono.ChVector3d(1, 0, 0))
body1_force.SetVrelpoint(body1_armA_end)
body1_force.SetMforce(5)  # magnitude

# --- BODY 2 SETUP ---
body2 = chrono.ChBody()
body2.SetPos(body2_pivot)  # Center of mass
body2.SetFixed(False)
body2.SetInertiaXX(chrono.ChVector3d(1e3, 1e3, 1e3))
body2.EnableCollision(True)
body2.SetMass(1)
sys.AddBody(body2)

# Revolute joint for BODY 2 at body2_pivot
body2_revolute = chrono.ChLinkLockRevolute()
mframe = chrono.ChFramed(body2_pivot, chrono.QUNIT)
body2_revolute.Initialize(staticbody, body2, mframe)
sys.Add(body2_revolute)
min_angle = 90 * chrono.CH_DEG_TO_RAD
max_angle = 180 * chrono.CH_DEG_TO_RAD
body2_revolute.LimitRz().SetActive(True)
body2_revolute.LimitRz().SetMin(min_angle)
body2_revolute.LimitRz().SetMax(max_angle)

# Contact material (for 2D arc + cylinder on body2)
contact_mat = chrono.ChContactMaterialNSC()
contact_mat.SetFriction(0.4)
contact_mat.SetRestitution(0.1)

# BODY 2: 2D arc shape (collision + visual)
center = chrono.ChCoordsysd(chrono.ChVector3d(0, 0, 0))
radius = 17
angle_start = 134.128 * chrono.CH_DEG_TO_RAD
angle_end = 142.532 * chrono.CH_DEG_TO_RAD

arc = chrono.ChLineArc(center, radius, angle_start, angle_end, True)
arc_shape = chrono.ChCollisionShapeArc2D(contact_mat, arc, radius)
body2.AddCollisionShape(arc_shape)

body2_arc_visual = chrono.ChVisualShapeLine()
body2_arc_visual.SetColor(chrono.ChColor(0.9, 0.1, 0.1))
body2_arc_visual.SetLineGeometry(arc)
body2.AddVisualShape(body2_arc_visual)

# BODY 2 arms (visual)
body2_armB_visual = chrono.ChVisualShapeLine()
body2_armB_visual.SetColor(chrono.ChColor(0.1, 0.9, 0.1))
body2_armB_visual.SetLineGeometry(chrono.ChLineSegment(chrono.ChVector3d(0, 0, 
0), body2_armB_end))
body2.AddVisualShape(body2_armB_visual)

# BODY 2 cylinder contact + visual at armA end
body2_contact_cyl = chrono.ChCollisionShapeCylinder(mat, 0.8, 0.1)
body2.AddCollisionShape(body2_contact_cyl, chrono.ChFramed(body2_armA_end, 
chrono.QUNIT))

body2_vis_cyl = chrono.ChVisualShapeCylinder(0.81823296, 0.1)
body2.AddVisualShape(body2_vis_cyl, chrono.ChFramed(body2_armA_end, 
chrono.QUNIT))

# Applied force/torque on BODY 2
body2_force = chrono.ChForce()
body2.AddForce(body2_force)
body2_force.SetMode(chrono.ChForce.FORCE)
body2_force.SetDir(chrono.ChVector3d(1, 0, 0))
body2_force.SetVrelpoint(body2_armB_end)
body2_force.SetMforce(5)

# --- VISUALIZATION & SIMULATION LOOP ---
vis = chronoirr.ChVisualSystemIrrlicht()
vis.AttachSystem(sys)
vis.SetWindowSize(1024, 768)
vis.SetWindowTitle('Two-Body Mechanism ')
vis.Initialize()
# vis.SetBackgroundColor(chrono.ChColor(1, 1, 1))
vis.AddCamera(chrono.ChVector3d(0, 0, 60))
vis.AddTypicalLights()
vis.EnableAbsCoordsysDrawing(True)
vis.EnableLinkFrameDrawing(True)

while vis.Run():
    vis.BeginScene()
    vis.Render()
    vis.EndScene()
    sys.DoStepDynamics(1e-3)

```
--
You received this message because you are subscribed to the Google Groups 
"ProjectChrono" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to 
[email protected]<mailto:[email protected]>.
To view this discussion visit 
https://groups.google.com/d/msgid/projectchrono/f1593e24-73e1-474b-b250-853b68e2c7a6n%40googlegroups.com<https://urldefense.com/v3/__https:/groups.google.com/d/msgid/projectchrono/f1593e24-73e1-474b-b250-853b68e2c7a6n*40googlegroups.com?utm_medium=email&utm_source=footer__;JQ!!Mak6IKo!N3zbzNnViotrNu9qWAWD1wy0fdELawnovJqvSHDxnvsUYOb3r26JQJUY_MqeQG3HXR45GgtrX6Kq5vImoL59dA$>.

-- 
You received this message because you are subscribed to the Google Groups 
"ProjectChrono" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/projectchrono/CH3PPF46CDC2185B44B2E5118D58BCD351BA7E1A%40CH3PPF46CDC2185.namprd06.prod.outlook.com.

Reply via email to