TEST_F(OsgSkeletonRepresentationRenderTests, WithNeutralPoseTest) { auto graphics = std::make_shared<SurgSim::Graphics::OsgSkeletonRepresentation>("Skeleton"); graphics->loadModel("OsgSkeletonRepresentationRenderTests/rigged_cylinder.osgt"); graphics->setSkinningShaderFileName("Shaders/skinning.vert"); graphics->setNeutralBonePose("Bone", makeRigidTransform(makeRotationQuaternion(M_PI_4, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero())); auto sceneElement = std::make_shared<SurgSim::Framework::BasicSceneElement>("Rigged Cylinder"); sceneElement->addComponent(graphics); scene->addSceneElement(sceneElement); viewElement->setPose(SurgSim::Math::makeRigidTransform( Vector3d(-0.3, 0.3, -0.3), Vector3d(0.0, 0.0, 0.0), Vector3d(0.0, 0.0, 1.0))); runtime->start(); boost::this_thread::sleep(boost::posix_time::milliseconds(2000)); std::pair<RigidTransform3d, RigidTransform3d> rootTransform; rootTransform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero()); rootTransform.second = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 1.0, 1.0)), Vector3d::Zero()); std::pair<RigidTransform3d, RigidTransform3d> boneTransform; boneTransform.first = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 0.0, 0.0)), Vector3d::Zero()); boneTransform.second = makeRigidTransform(makeRotationQuaternion(0.0, Vector3d(1.0, 0.0, 0.0)), Vector3d(0.0, 4.0, 0.0)); int numSteps = 1000; for (int i = 0; i < numSteps; ++i) { double t = static_cast<double>(i) / numSteps; RigidTransform3d pose = interpolate(rootTransform, t); sceneElement->setPose(pose); pose = interpolate(boneTransform, t / 3.0); graphics->setBonePose("Bone", RigidTransform3d::Identity()); graphics->setBonePose("Bone_001", pose); graphics->setBonePose("Bone_002", pose); graphics->setBonePose("Bone_003", pose); /// The total number of steps should complete in 5 seconds boost::this_thread::sleep(boost::posix_time::milliseconds(5000 / numSteps)); } runtime->stop(); }
void AnimController::priv_walk_anim_node( PyramidObject *node ) { setBonePose( node ); PyramidObject *child = 0; if (node->getChild() != 0) { child = (PyramidObject *)node->getChild(); while (child != 0) { priv_walk_anim_node( child ); child = (PyramidObject *)child->getSibling(); } } }
void Teddy::walk_anim_node(GameObject *node ) { setBonePose( node ); // --------- Do pose stuff here ----------------------- GameObject *child = 0; // iterate through all of the active children if (node->getChild() != 0) { child = (GameObject *)node->getChild(); // make sure that allocation is not a child node while (child != 0) { walk_anim_node( child ); // goto next sibling child = (GameObject *)child->getSibling(); } } else { // bye bye exit condition } }