hkaTwoJointsIkSolver.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:5k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef INC_HKA_TWO_JOINTS_IK_SOLVER_H
  9. #define INC_HKA_TWO_JOINTS_IK_SOLVER_H
  10. #include <Common/Base/hkBase.h>
  11. class hkaPose;
  12. /// This IK solver operates on the two specified joints in order for a third bone/joint to reach
  13. /// a desired position. The first joint is considered to be a ball-socket, while the second joint is considered to be
  14. /// a hinge joint (and therefore an axis must be provided).
  15. /// The joints/bones do not need to be immediate parents of each other (but they must be in the same chain).
  16. class hkaTwoJointsIkSolver : public hkReferencedObject
  17. {
  18. public:
  19. HK_DECLARE_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME );
  20. /// This setup data is passed to every call of solve()
  21. struct Setup
  22. {
  23. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_ANIM_RUNTIME, hkaTwoJointsIkSolver::Setup );
  24. /// The id of the first joint (ball-socket : thigh, shoulder)
  25. hkInt16 m_firstJointIdx;
  26. /// The id of the second joint (hinge : knee, elbow)
  27. hkInt16 m_secondJointIdx;
  28. /// The id of the end bone (usually heel, hand, toe)
  29. hkInt16 m_endBoneIdx;
  30. /// The hinge axis for the second joint, in local space. Positive rotations (using right hand rule) around this
  31. /// axis should extend the limb.
  32. hkVector4 m_hingeAxisLS;
  33. /// Limit the hinge angle (to avoid knee/elbow artifacts). Default is -1 (180 deg). 
  34. hkReal m_cosineMaxHingeAngle;
  35. /// Limit the hinge angle (to avoid knee/elbow artifacts). Default is 1 (0 deg). 
  36. hkReal m_cosineMinHingeAngle;
  37. /// Gain of the Ik applied to the first joint (from 0 to 1). You can use this to transition smoothly from/to ik-fixed poses
  38. hkReal m_firstJointIkGain;
  39. /// Gain of the Ik applied to the second joint (from 0 to 1). You can use this to transition smoothly from/to ik-fixed poses
  40. hkReal m_secondJointIkGain;
  41. /// Gain of the Ik applied to the end joint (from 0 to 1). You can use this to transition smoothly from/to ik-fixed poses
  42. /// Only has an effect if m_enforceEndRotation is true
  43. hkReal m_endJointIkGain;
  44. /// The target position for the end bone, in model space
  45. hkVector4 m_endTargetMS;
  46. /// The target rotation for the end bone in model space
  47. hkQuaternion m_endTargetRotationMS;
  48. /// The offset of the end effector in the local space of the end bone
  49. hkVector4 m_endBoneOffsetLS;
  50. /// The rotation offset of the end effector in the local space of the end bone
  51. hkQuaternion m_endBoneRotationOffsetLS;
  52. /// Set to true if the position of the end effector is to be solved for
  53. hkBool m_enforceEndPosition;
  54. /// Set to true if the rotation of the end effector is to be solved for
  55. hkBool m_enforceEndRotation;
  56. // Sets defaults
  57. Setup() :
  58. m_firstJointIdx (-1),
  59. m_secondJointIdx(-1),
  60. m_endBoneIdx(-1),
  61. m_hingeAxisLS(hkVector4::getZero()),
  62. m_cosineMaxHingeAngle (-1.0f),
  63. m_cosineMinHingeAngle(1.0f),
  64. m_firstJointIkGain(1.0f),
  65. m_secondJointIkGain(1.0f),
  66. m_endJointIkGain(1.0f),
  67. m_endTargetMS(hkVector4::getZero()),
  68. m_endTargetRotationMS(hkQuaternion::getIdentity()),
  69. m_endBoneOffsetLS(hkVector4::getZero()),
  70. m_endBoneRotationOffsetLS(hkQuaternion::getIdentity()),
  71. m_enforceEndPosition(true),
  72. m_enforceEndRotation(false)
  73. {
  74. }
  75. };
  76. /// Modifies the given pose in order to solve the two two-joint system described in the setup parameter.
  77. static hkBool HK_CALL solve ( const Setup& setup, hkaPose& poseInOut );
  78. };
  79. #endif // INC_HKA_TWO_JOINTS_IK_SOLVER_H
  80. /*
  81. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  82. * Confidential Information of Havok.  (C) Copyright 1999-2009
  83. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  84. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  85. * rights, and intellectual property rights in the Havok software remain in
  86. * Havok and/or its suppliers.
  87. * Use of this software for evaluation purposes is subject to and indicates
  88. * acceptance of the End User licence Agreement for this product. A copy of
  89. * the license is included with this software and is also available at www.havok.com/tryhavok.
  90. */