MeshPersonVisual::MeshPersonVisual(const PersonVisualDefaultArgs& args) : PersonVisual(args), m_animationState(NULL), m_walkingSpeed(1.0), entity_(NULL) { m_childSceneNode = m_sceneNode->createChildSceneNode(); m_childSceneNode->setVisible(false); std::string meshResource = "package://" ROS_PACKAGE_NAME "/media/animated_walking_man.mesh"; /// This is required to load referenced skeletons from package:// path fs::path model_path(meshResource); fs::path parent_path(model_path.parent_path()); Ogre::ResourceLoadingListener *newListener = new RosPackagePathResourceLoadingListener(parent_path), *oldListener = Ogre::ResourceGroupManager::getSingleton().getLoadingListener(); Ogre::ResourceGroupManager::getSingleton().setLoadingListener(newListener); bool loadFailed = rviz::loadMeshFromResource(meshResource).isNull(); Ogre::ResourceGroupManager::getSingleton().setLoadingListener(oldListener); delete newListener; // Create scene entity static size_t count = 0; std::stringstream ss; ss << "mesh_person_visual" << count++; std::string id = ss.str(); entity_ = m_sceneManager->createEntity(id, meshResource); m_childSceneNode->attachObject(entity_); // set up animation setAnimationState(""); // set up material ss << "Material"; Ogre::MaterialPtr default_material = Ogre::MaterialManager::getSingleton().create( ss.str(), "rviz" ); default_material->setReceiveShadows(false); default_material->getTechnique(0)->setLightingEnabled(true); default_material->getTechnique(0)->setAmbient( 0.5, 0.5, 0.5 ); materials_.insert( default_material ); entity_->setMaterial( default_material ); // set position Ogre::Quaternion quat1; quat1.FromAngleAxis(Ogre::Degree(90), Ogre::Vector3(0,1,0)); Ogre::Quaternion quat2; quat2.FromAngleAxis(Ogre::Degree(-90), Ogre::Vector3(0,0,1)); m_childSceneNode->setOrientation(quat1 * quat2); double scaleFactor = 0.243 * 1.75; m_childSceneNode->setScale(Ogre::Vector3(scaleFactor, scaleFactor, scaleFactor)); m_childSceneNode->setPosition(Ogre::Vector3(0, 0, -1)); m_childSceneNode->setVisible(true); }
MeshAnimation::MeshAnimation( Ogre::AnimationState* animState, MeshObject* mesh, Ogre::Real speed, unsigned int timesToPlay, bool paused ) : BaseAnimation( animState->getLength(), speed, timesToPlay, paused ), mMeshObject( mesh ) { setAnimationState(animState); mAnimation = static_cast<Entity*>(mMeshObject->getMovableObject())->getSkeleton() ->getAnimation(animState->getAnimationName()); }
int LLFloaterAO::getAnimationState() { if (gAgent.getAvatarObject()) { if (gAgent.getAvatarObject()->mBelowWater) { setAnimationState(STATE_AGENT_FLOATING); } else if (gAgent.getFlying()) { setAnimationState(STATE_AGENT_HOVER); } else if (gAgent.getAvatarObject()->mIsSitting) { if (mAnimationState != STATE_AGENT_GROUNDSIT) { setAnimationState(STATE_AGENT_SIT); } } } return mAnimationState; }
void MeshPersonVisual::setAnimationState(const std::string& nameOfAnimationState) { Ogre::AnimationStateSet *animationStates = entity_->getAllAnimationStates(); if(animationStates != NULL) { Ogre::AnimationStateIterator animationsIterator = animationStates->getAnimationStateIterator(); while (animationsIterator.hasMoreElements()) { Ogre::AnimationState *animationState = animationsIterator.getNext(); if(animationState->getAnimationName() == nameOfAnimationState || nameOfAnimationState.empty()) { animationState->setLoop(true); animationState->setEnabled(true); m_animationState = animationState; return; } } // Not found. Set first animation state then. ROS_WARN_STREAM_ONCE("Person mesh animation state " << nameOfAnimationState << " does not exist in mesh!"); setAnimationState(""); } }