Revision control
Copy as Markdown
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include "qflexiblejoint_p.h"
#include <extensions/PxJoint.h>
QT_BEGIN_NAMESPACE
/*!
\qmltype FlexibleJoint
\inqmlmodule QtQuick3D.Physics
\since 6.13
\inherits PhysicsJoint
\brief Base type for flexible joints with configurable spring stiffness and damping.
This is the abstract base type for all joints that support customizable spring stiffness
and damping factors for soft constraints and joint limits.
Whether a joint limit is hard or soft, and how it behaves when soft, depends on the
combination of \l stiffness and \l damping, as seen in the following table:
\table
\header
\li \l stiffness
\li \l damping
\li Behavior
\row
\li \c 0.0
\li \c 0.0
\li Hard constraint: the limit cannot be penetrated (the default).
\row
\li greater than \c 0.0
\li \c 0.0
\li Soft spring, undamped: the body bounces against the limit indefinitely.
\row
\li greater than \c 0.0
\li greater than \c 0.0
\li Soft spring, damped: the body bounces against the limit and settles.
\row
\li \c 0.0
\li greater than \c 0.0
\li Soft, viscous drag only: motion is resisted, but no positional restoring force is
applied.
\endtable
\note At least one of the connected bodies needs to be dynamic.
\sa {FixedJoint}
\sa {DistanceJoint}
\sa {PrismaticJoint}
\sa {RevoluteJoint}
\sa {SphericalJoint}
\sa {D6Joint}
*/
/*!
\qmlproperty real FlexibleJoint::stiffness
\since 6.13
\default 0.0
This property holds the spring stiffness for joint limits. See the table above for how it
combines with \l damping to determine whether the limit is hard or soft.
When greater than \c 0.0, the higher the value, the stronger the restorative force pulling
the body back once it crosses the limit boundary, and the less penetration is allowed before
the body is pushed back. The right value depends on the mass and geometry of the connected
bodies. A value that feels stiff for a light body with a short lever arm may feel soft for a
heavier body or a longer lever arm, so start from a small value and increase it until the
limit feels sufficiently rigid for your scene.
Range: \c{[0, \inf)}
\sa damping, PhysicsWorld::typicalLength, PhysicsWorld::defaultDensity
*/
/*!
\qmlproperty real FlexibleJoint::damping
\since 6.13
\default 0.0
This property holds the energy dissipation (damping factor) for soft joint limits. See the
table above for how it combines with \l stiffness to determine whether the limit is hard or
soft.
When \l stiffness is greater than \c 0.0, this property controls how quickly oscillations
around the limit boundary settle: with \c 0.0 (the default), no energy is lost and the body
bounces indefinitely; increasing the value suppresses the bounce, though too little leaves
the body oscillating before it settles, while too much makes the motion near the limit feel
heavy or sluggish.
When \l stiffness is \c 0.0, this property instead applies a resistive (viscous) force with
no positional restoring effect.
Range: \c{[0, \inf)}
\sa stiffness, PhysicsWorld::typicalLength, PhysicsWorld::defaultDensity
*/
float QFlexibleJoint::stiffness() const
{
return m_stiffness;
}
void QFlexibleJoint::setStiffness(float stiffness)
{
stiffness = qMax(0.f, stiffness);
if (qFuzzyCompare(m_stiffness, stiffness))
return;
m_stiffness = stiffness;
m_dirtyProperties = true;
emit stiffnessChanged();
}
float QFlexibleJoint::damping() const
{
return m_damping;
}
void QFlexibleJoint::setDamping(float damping)
{
damping = qMax(0.f, damping);
if (qFuzzyCompare(m_damping, damping))
return;
m_damping = damping;
m_dirtyProperties = true;
emit dampingChanged();
}
QT_END_NAMESPACE