
CylinderPartNoVisuals is Physics3D.System:
    with Traits.CylinderPart
    body is Physics3D.Bodies.RigidBody:
        kinematics.local_transform.position.x: 0
    snap_connector.redirected_parent: body
    bearing_left.redirected_parent: body
    bearing_right.redirected_parent: body
    cylinder_connector.redirected_parent: body

CylinderBodyVisuals is Physics3D.Bodies.RigidBody:
    # Visuals for bearings
    bearing_left_visual is Visuals.BearingVisual
    bearing_right_visual is Visuals.BearingVisual
    visual is Visuals.Geometries.Cylinder:
        radius: geometry.radius
        height: geometry.height
        local_transform: geometry.local_transform
    geometry is Physics3D.Geometries.Cylinder:
        radius: 0.1
        local_transform.rotation: Math.Quat.from_to(Math.Vec3.Y_AXIS(), Definitions.AlongBodyNormal)

CylinderPart is CylinderPartNoVisuals:
    body becomes CylinderBodyVisuals:
        bearing_left_visual.local_transform.position: bearing_left.position
        bearing_right_visual.local_transform.position: bearing_right.position
        geometry.height: length
        geometry.local_transform.position: Definitions.AlongBodyNormal * bottom_height

