Program Listing for File ContactForce.h#
↰ Return to documentation for file (include/Karana/Collision/ContactForce.h)
/*
* Copyright (c) 2024-2026 Karana Dynamics Pty Ltd. All rights reserved.
*
* NOTICE TO USER:
*
* This source code and/or documentation (the "Licensed Materials") is
* the confidential and proprietary information of Karana Dynamics Inc.
* Use of these Licensed Materials is governed by the terms and conditions
* of a separate software license agreement between Karana Dynamics and the
* Licensee ("License Agreement"). Unless expressly permitted under that
* agreement, any reproduction, modification, distribution, or disclosure
* of the Licensed Materials, in whole or in part, to any third party
* without the prior written consent of Karana Dynamics is strictly prohibited.
*
* THE LICENSED MATERIALS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
* KARANA DYNAMICS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, AND
* FITNESS FOR A PARTICULAR PURPOSE.
*
* IN NO EVENT SHALL KARANA DYNAMICS BE LIABLE FOR ANY DAMAGES WHATSOEVER,
* INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS, DATA, OR USE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, WHETHER IN CONTRACT, TORT,
* OR OTHERWISE ARISING OUT OF OR IN CONNECTION WITH THE LICENSED MATERIALS.
*
* U.S. Government End Users: The Licensed Materials are a "commercial item"
* as defined at 48 C.F.R. 2.101, and are provided to the U.S. Government
* only as a commercial end item under the terms of this license.
*
* Any use of the Licensed Materials in individual or commercial software must
* include, in the user documentation and internal source code comments,
* this Notice, Disclaimer, and U.S. Government Use Provision.
*/
/**
* @file
* @brief Defines ContactForceBase. The base class for all contact force models.
*/
#pragma once
#include "Karana/Collision/FrameCollider.h"
#include "Karana/SOADyn/Node.h"
#include "Karana/SOADyn/SubTree.h"
namespace Karana::Collision {
namespace kc = Karana::Core;
namespace km = Karana::Math;
namespace kd = Karana::Dynamics;
/**
* @class ContactForceBase
* @brief Base class for all contact force models.
*
* See \sref{collision_dynamics_sec} for more discussion on
* contact and collision dynamics.
*/
class ContactForceBase : public kc::Base {
public:
/* @brief ContactForceBase class constructor.
*
* @param name Name for the ContactForceBase.
* @param container The container to add the Base too.
* If none is specified, the default singleton container will be used.
*/
using kc::Base::Base;
/**
* @brief Apply the contact force for the associated contact.
*
* This first calls computeForce to get the contact force. Then, it
* applies it to frames if those frames belong to a body.
*
* @param contact The contact to apply the force for.
* @param st The SubTree we are computing forces for.
*/
virtual void applyForce(const FrameContact &contact,
const kc::ks_ptr<Karana::Dynamics::SubTree> &st);
/**
* @brief Compute the contact force for the associated contact.
*
* @param contact The contact to compute the force for.
* @param nd_1 The contact node associated with object 1. This node is located at
* contact.location_1 and the frame of the node is that of frame_1.
* @param nd_2 The contact node associated with object 2. This node is located at
* contact.location_2 and the frame of the node is that of frame_2.
* @returns The contact force on the frame_1 object at location_1 expressed in frame_1
* coordinates.
*/
virtual km::SpatialVector computeForce(const FrameContact &contact,
const kc::ks_ptr<kd::Node> &nd_1,
const kc::ks_ptr<kd::Node> &nd_2) = 0;
/// The pair of nodes used when computing the contact force
using NodePair = std::pair<kc::ks_ptr<kd::Node>, kc::ks_ptr<kd::Node>>;
/**
* @brief Get the pair of nodes from the most recent contact.
* @returns The node pair (may be null)
*/
const NodePair &getLastNodePair() const;
/**
* @brief Reset the most recent contact node pair to nullptr
*/
virtual void resetLastNodePair();
protected:
/// The last node pair used in contact force calculation
NodePair _last_node_pair = {nullptr, nullptr};
};
} // namespace Karana::Collision