196 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
Bullet Continuous Collision Detection and Physics Library
 | 
						|
Copyright (c) 2013 Erwin Coumans  http://bulletphysics.org
 | 
						|
 | 
						|
This software is provided 'as-is', without any express or implied warranty.
 | 
						|
In no event will the authors be held liable for any damages arising from the use of this software.
 | 
						|
Permission is granted to anyone to use this software for any purpose,
 | 
						|
including commercial applications, and to alter it and redistribute it freely,
 | 
						|
subject to the following restrictions:
 | 
						|
 | 
						|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
 | 
						|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
 | 
						|
3. This notice may not be removed or altered from any source distribution.
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef BT_MULTIBODY_CONSTRAINT_H
 | 
						|
#define BT_MULTIBODY_CONSTRAINT_H
 | 
						|
 | 
						|
#include "LinearMath/btScalar.h"
 | 
						|
#include "LinearMath/btAlignedObjectArray.h"
 | 
						|
#include "btMultiBody.h"
 | 
						|
 | 
						|
class btMultiBody;
 | 
						|
struct btSolverInfo;
 | 
						|
 | 
						|
#include "btMultiBodySolverConstraint.h"
 | 
						|
 | 
						|
struct btMultiBodyJacobianData
 | 
						|
{
 | 
						|
	btAlignedObjectArray<btScalar>		m_jacobians;
 | 
						|
	btAlignedObjectArray<btScalar>		m_deltaVelocitiesUnitImpulse;	//holds the joint-space response of the corresp. tree to the test impulse in each constraint space dimension
 | 
						|
	btAlignedObjectArray<btScalar>		m_deltaVelocities;				//holds joint-space vectors of all the constrained trees accumulating the effect of corrective impulses applied in SI
 | 
						|
	btAlignedObjectArray<btScalar>		scratch_r;
 | 
						|
	btAlignedObjectArray<btVector3>		scratch_v;
 | 
						|
	btAlignedObjectArray<btMatrix3x3>	scratch_m;
 | 
						|
	btAlignedObjectArray<btSolverBody>*	m_solverBodyPool;
 | 
						|
	int									m_fixedBodyId;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
ATTRIBUTE_ALIGNED16(class) btMultiBodyConstraint
 | 
						|
{
 | 
						|
protected:
 | 
						|
 | 
						|
	btMultiBody*	m_bodyA;
 | 
						|
    btMultiBody*	m_bodyB;
 | 
						|
    int				m_linkA;
 | 
						|
    int				m_linkB;
 | 
						|
 | 
						|
    int				m_numRows;
 | 
						|
    int				m_jacSizeA;
 | 
						|
    int				m_jacSizeBoth;
 | 
						|
    int				m_posOffset;
 | 
						|
 | 
						|
	bool			m_isUnilateral;
 | 
						|
	int				m_numDofsFinalized;
 | 
						|
	btScalar		m_maxAppliedImpulse;
 | 
						|
 | 
						|
 | 
						|
    // warning: the data block lay out is not consistent for all constraints
 | 
						|
    // data block laid out as follows:
 | 
						|
    // cached impulses. (one per row.)
 | 
						|
    // jacobians. (interleaved, row1 body1 then row1 body2 then row2 body 1 etc)
 | 
						|
    // positions. (one per row.)
 | 
						|
    btAlignedObjectArray<btScalar> m_data;
 | 
						|
 | 
						|
	void	applyDeltaVee(btMultiBodyJacobianData& data, btScalar* delta_vee, btScalar impulse, int velocityIndex, int ndof);
 | 
						|
    
 | 
						|
	btScalar fillMultiBodyConstraint(btMultiBodySolverConstraint& solverConstraint,
 | 
						|
																btMultiBodyJacobianData& data,
 | 
						|
                                     btScalar* jacOrgA, btScalar* jacOrgB,
 | 
						|
                                     const btVector3& constraintNormalAng,
 | 
						|
                                     
 | 
						|
																const btVector3& constraintNormalLin,
 | 
						|
																const btVector3& posAworld, const btVector3& posBworld,
 | 
						|
																btScalar posError,
 | 
						|
																const btContactSolverInfo& infoGlobal,
 | 
						|
                                     btScalar lowerLimit, btScalar upperLimit,
 | 
						|
                                     bool angConstraint = false,
 | 
						|
                                     
 | 
						|
																btScalar relaxation = 1.f,
 | 
						|
																bool isFriction = false, btScalar desiredVelocity=0, btScalar cfmSlip=0);
 | 
						|
 | 
						|
public:
 | 
						|
 | 
						|
	BT_DECLARE_ALIGNED_ALLOCATOR();
 | 
						|
 | 
						|
	btMultiBodyConstraint(btMultiBody* bodyA,btMultiBody* bodyB,int linkA, int linkB, int numRows, bool isUnilateral);
 | 
						|
	virtual ~btMultiBodyConstraint();
 | 
						|
 | 
						|
	void updateJacobianSizes();
 | 
						|
	void allocateJacobiansMultiDof();
 | 
						|
 | 
						|
	//many constraints have setFrameInB/setPivotInB. Will use 'getConstraintType' later.
 | 
						|
	virtual void setFrameInB(const btMatrix3x3& frameInB) {}
 | 
						|
	virtual void setPivotInB(const btVector3& pivotInB){}
 | 
						|
 | 
						|
	virtual void finalizeMultiDof()=0;
 | 
						|
 | 
						|
	virtual int getIslandIdA() const =0;
 | 
						|
	virtual int getIslandIdB() const =0;
 | 
						|
 | 
						|
	virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows,
 | 
						|
		btMultiBodyJacobianData& data,
 | 
						|
		const btContactSolverInfo& infoGlobal)=0;
 | 
						|
 | 
						|
	int	getNumRows() const
 | 
						|
	{
 | 
						|
		return m_numRows;
 | 
						|
	}
 | 
						|
 | 
						|
	btMultiBody*	getMultiBodyA()
 | 
						|
	{
 | 
						|
		return m_bodyA;
 | 
						|
	}
 | 
						|
    btMultiBody*	getMultiBodyB()
 | 
						|
	{
 | 
						|
		return m_bodyB;
 | 
						|
	}
 | 
						|
 | 
						|
	void	internalSetAppliedImpulse(int dof, btScalar appliedImpulse)
 | 
						|
	{
 | 
						|
		btAssert(dof>=0);
 | 
						|
		btAssert(dof < getNumRows());
 | 
						|
		m_data[dof] = appliedImpulse;
 | 
						|
        
 | 
						|
	}
 | 
						|
	
 | 
						|
	btScalar	getAppliedImpulse(int dof)
 | 
						|
	{
 | 
						|
		btAssert(dof>=0);
 | 
						|
		btAssert(dof < getNumRows());
 | 
						|
		return m_data[dof];
 | 
						|
	}
 | 
						|
	// current constraint position
 | 
						|
    // constraint is pos >= 0 for unilateral, or pos = 0 for bilateral
 | 
						|
    // NOTE: ignored position for friction rows.
 | 
						|
    btScalar getPosition(int row) const
 | 
						|
	{
 | 
						|
		return m_data[m_posOffset + row];
 | 
						|
	}
 | 
						|
 | 
						|
    void setPosition(int row, btScalar pos)
 | 
						|
	{
 | 
						|
		m_data[m_posOffset + row] = pos;
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
	bool isUnilateral() const
 | 
						|
	{
 | 
						|
		return m_isUnilateral;
 | 
						|
	}
 | 
						|
 | 
						|
	// jacobian blocks.
 | 
						|
    // each of size 6 + num_links. (jacobian2 is null if no body2.)
 | 
						|
    // format: 3 'omega' coefficients, 3 'v' coefficients, then the 'qdot' coefficients.
 | 
						|
    btScalar* jacobianA(int row)
 | 
						|
	{
 | 
						|
		return &m_data[m_numRows + row * m_jacSizeBoth];
 | 
						|
	}
 | 
						|
    const btScalar* jacobianA(int row) const
 | 
						|
	{
 | 
						|
		return &m_data[m_numRows + (row * m_jacSizeBoth)];
 | 
						|
	}
 | 
						|
    btScalar* jacobianB(int row)
 | 
						|
	{
 | 
						|
		return &m_data[m_numRows + (row * m_jacSizeBoth) + m_jacSizeA];
 | 
						|
	}
 | 
						|
    const btScalar* jacobianB(int row) const
 | 
						|
	{
 | 
						|
		return &m_data[m_numRows + (row * m_jacSizeBoth) + m_jacSizeA];
 | 
						|
	}
 | 
						|
 | 
						|
	btScalar	getMaxAppliedImpulse() const
 | 
						|
	{
 | 
						|
		return m_maxAppliedImpulse;
 | 
						|
	}
 | 
						|
	void	setMaxAppliedImpulse(btScalar maxImp)
 | 
						|
	{
 | 
						|
		m_maxAppliedImpulse = maxImp;
 | 
						|
	}
 | 
						|
 | 
						|
	virtual void debugDraw(class btIDebugDraw* drawer)=0;
 | 
						|
 | 
						|
	virtual void setGearRatio(btScalar ratio) {}
 | 
						|
	virtual void setGearAuxLink(int gearAuxLink) {}
 | 
						|
	virtual void setRelativePositionTarget(btScalar relPosTarget){}
 | 
						|
	virtual void setErp(btScalar erp){}
 | 
						|
	
 | 
						|
	
 | 
						|
};
 | 
						|
 | 
						|
#endif //BT_MULTIBODY_CONSTRAINT_H
 | 
						|
 |