Files
vb01/ikSolverTest.cpp
T

73 lines
2.2 KiB
C++

#include "ikSolverTest.h"
#include "ikSolver.h"
#include "skeleton.h"
#include "animationController.h"
namespace vb01{
void IkSolverTest::setUp(){
rootNode = Root::getSingleton()->getRootNode();
skeleton = new Skeleton();
Bone *boneA = new Bone("A", 1, Vector3::VEC_ZERO, Quaternion::QUAT_W, Vector3::VEC_IJK);
Bone *boneB = new Bone("B", 1, Vector3::VEC_J, Quaternion::QUAT_W, Vector3::VEC_IJK);
Bone *boneC = new Bone("C", 1, Vector3::VEC_J, Quaternion::QUAT_W, Vector3::VEC_IJK);
Bone *boneD = new Bone("D", 1, Vector3::VEC_J, Quaternion::QUAT_W, Vector3::VEC_IJK);
ikBone = new Bone("ik", 1, Vector3(0, 4, 0), Quaternion::QUAT_W, Vector3::VEC_IJK);
skeleton->addBone(boneA, (Bone*)rootNode);
skeleton->addBone(boneB, boneA);
skeleton->addBone(boneC, boneB);
skeleton->addBone(boneD, boneC);
skeleton->addBone(ikBone, boneA);
boneA->lookAt(Vector3::VEC_K, Vector3::VEC_J);
boneB->lookAt(Vector3::VEC_K, Vector3::VEC_J);
boneC->lookAt(Vector3::VEC_K, Vector3::VEC_J);
boneD->lookAt(Vector3::VEC_K, Vector3::VEC_J);
boneD->setIkChainLength(chainLength);
boneD->setIkTarget(ikBone->getName());
ikPos = new Vector3[chainLength];
boneChain = new Bone*[chainLength];
resetIkData();
}
void IkSolverTest::tearDown(){
}
void IkSolverTest::testSolveIk(){
Vector3 ikBonePos = Vector3(1, 1, 1) * 5 + Vector3(0, 1, 0);
resetIkData();
IkSolver::calculateFabrik(chainLength, boneChain, ikPos, ikBonePos);
float eps = .01;
for(int i = chainLength - 1; i >= 0; i--)
CPPUNIT_ASSERT(ikPos[i].getDistanceFrom(Vector3(0, 1, 0) + Vector3(1, 1, 1).norm() * (chainLength - 1 - i)) <= eps);
ikBonePos = Vector3(0, 1, 0) * 2 + Vector3(2, 0, 0);
resetIkData();
IkSolver::calculateFabrik(chainLength, boneChain, ikPos, ikBonePos);
/*
CPPUNIT_ASSERT(ikPos[1].getDistanceFrom(Vector3(0.171451, 1.98516, 0)) <= eps);
CPPUNIT_ASSERT(ikPos[0].getDistanceFrom(Vector3(1.08232, 2.39756, 0)) <= eps);
*/
}
void IkSolverTest::resetIkData(){
Bone *rootBone = skeleton->getRootBone();
Bone *ikBoneAncestor = skeleton->getBone("D");
for(int i = 0; i < chainLength; i++){
boneChain[i] = ikBoneAncestor;
ikBoneAncestor = (Bone*)ikBoneAncestor->getParent();
ikPos[i] = boneChain[i]->getModelSpacePos();
}
}
}