本文整理汇总了C++中CalBone::calculateState方法的典型用法代码示例。如果您正苦于以下问题:C++ CalBone::calculateState方法的具体用法?C++ CalBone::calculateState怎么用?C++ CalBone::calculateState使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CalBone
的用法示例。
在下文中一共展示了CalBone::calculateState方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: BoneSetTrans
/////////////////////////////////////
// Purpose: set the relative translation
// of the given bone
// Output: bone moved
// Return: none
/////////////////////////////////////
void IgfxObject::BoneSetTrans(s32 boneID, const Vec3D & loc)
{
if(m_pCalModel)
{
Vec3D trans; BoneGetTrans(boneID, &trans);
CalSkeleton *pSkel = m_pCalModel->getSkeleton();
CalBone *pBone = pSkel->getBone(boneID);
if(pBone)
{
pBone->setTranslation(CalVector(trans.x+loc.x, trans.y+loc.y, trans.z+loc.z));
pBone->calculateState();
}
}
}
示例2: BoneSetRotate
/////////////////////////////////////
// Purpose: set the relative rotation
// of the given bone
// Output: bone rotated
// Return: none
/////////////////////////////////////
void IgfxObject::BoneSetRotate(s32 boneID, const Quaternion & q)
{
if(m_pCalModel)
{
Quaternion quat; BoneGetRotate(boneID, &quat);
quat *= q;
CalSkeleton *pSkel = m_pCalModel->getSkeleton();
CalBone *pBone = pSkel->getBone(boneID);
if(pBone)
{
pBone->setRotation(CalQuaternion(quat.x, quat.y, quat.z, quat.w));
pBone->calculateState();
}
}
}
示例3: calculateState
void CalBone::calculateState()
{
// check if the bone was not touched by any active animation
if(m_accumulatedWeight == 0.0f)
{
// set the bone to the initial skeleton state
m_translation = m_pCoreBone->getTranslation();
m_rotation = m_pCoreBone->getRotation();
}
// get parent bone id
int parentId;
parentId = m_pCoreBone->getParentId();
if(parentId == -1)
{
// no parent, this means absolute state == relative state
m_translationAbsolute = m_translation;
m_rotationAbsolute = m_rotation;
}
else
{
// get the parent bone
const CalBone *pParent;
pParent = m_pSkeleton->getBone(parentId);
// transform relative state with the absolute state of the parent
m_translationAbsolute = m_translation;
m_translationAbsolute *= pParent->getRotationAbsolute();
m_translationAbsolute += pParent->getTranslationAbsolute();
m_rotationAbsolute = m_rotation;
m_rotationAbsolute *= pParent->getRotationAbsolute();
}
// calculate the bone space transformation
m_translationBoneSpace = m_pCoreBone->getTranslationBoneSpace();
// Must go before the *= m_rotationAbsolute.
bool meshScalingOn;
if( m_meshScaleAbsolute.x != 1 || m_meshScaleAbsolute.y != 1 || m_meshScaleAbsolute.z != 1 ) {
meshScalingOn = true;
CalVector scalevec;
// The mesh transformation is intended to apply to the vector from the
// bone node to the vert, relative to the model's global coordinate system.
// For example, even though the head node's X axis aims up, the model's
// global coordinate system has X to stage right, Z up, and Y stage back.
//
// The standard vert transformation is:
// v1 = vmesh - boneAbsPosInJpose
// v2 = v1 * boneAbsRotInAnimPose
// v3 = v2 + boneAbsPosInAnimPose
//
// Cal3d does the calculation by:
// u1 = umesh * transformMatrix
// u2 = u1 + translationBoneSpace
//
// where translationBoneSpace =
// "coreBoneTranslationBoneSpace"
// * boneAbsRotInAnimPose
// + boneAbsPosInAnimPose
//
// and where transformMatrix =
// "coreBoneRotBoneSpace"
// * boneAbsRotInAnimPose
//
// I don't know what "coreBoneRotBoneSpace" and "coreBoneTranslationBoneSpace" actually are,
// but to add scale to the scandard vert transformation, I simply do:
//
// v3' = vmesh * scalevec * boneAbsRotInAnimPose
// - boneAbsPosInJpose * scalevec * boneAbsRotInAnimPose
// + boneAbsPosInAnimPose
//
// Essentially, the boneAbsPosInJpose is just an extra vector added to
// each vertex that we want to subtract out. We must transform the extra
// vector in exactly the same way we transform the vmesh. Therefore if we scale the mesh, we
// must also scale the boneAbsPosInJpose.
//
// Expanding out the u2 equation, we have:
//
// u2 = umesh * "coreBoneRotBoneSpace" * boneAbsRotInAnimPose
// + "coreBoneTranslationBoneSpace" * boneAbsRotInAnimPose
// + boneAbsPosInAnimPose
//
// We assume that "coreBoneTranslationBoneSpace" = vectorThatMustBeSubtractedFromUmesh * "coreBoneRotBoneSpace":
//
// u2 = umesh * "coreBoneRotBoneSpace" * boneAbsRotInAnimPose
// + vectorThatMustBeSubtractedFromUmesh * "coreBoneRotBoneSpace" * boneAbsRotInAnimPose
// + boneAbsPosInAnimPose
//
// We assume that scale should be applied to umesh, not umesh * "coreBoneRotBoneSpace":
//
// u2 = umesh * scaleVec * "coreBoneRotBoneSpace" * boneAbsRotInAnimPose
// + "coreBoneTranslationBoneSpace" * "coreBoneRotBoneSpaceInverse" * scaleVec * "coreBoneRotBoneSpace" * boneAbsRotInAnimPose
// + boneAbsPosInAnimPose
//
// which yields,
//
// transformMatrix' = scaleVec * "coreBoneRotBoneSpace" * boneAbsRotInAnimPose
//.........这里部分代码省略.........