void FvXMLAnimationModelSerializerImpl::ReadAnimation( 
	FvXMLSectionPtr spSection, Ogre::SceneNode* pkNode, FvAnimationModel* pkDest )
{
	Ogre::SceneManager *pkSceneManager = Ogre::Root::getSingleton().
		_getCurrentSceneManager();
	FV_ASSERT(pkSceneManager);

	FvString kAnimationName = spSection->ReadString("name");
	bool bEnable = spSection->ReadBool("enable");
	bool bLoop = spSection->ReadBool("loop");
	FvString kIterpolationMode = spSection->ReadString("interpolationMode");
	FvString kRotationIterpolationMode = spSection->ReadString("rotationInterpolationMode");
	float fLength = spSection->ReadFloat("length");

	if(!pkSceneManager->hasAnimation(pkNode->getName() + kAnimationName))
	{
		std::vector<FvXMLSectionPtr> kKeyFrames;
		spSection->OpenSections("keyframe",kKeyFrames);

		Animation *pkAnimation = pkSceneManager->createAnimation(pkNode->getName() + kAnimationName, fLength);
		if(strcmp(kIterpolationMode.c_str(),"spline") == 0)
			pkAnimation->setInterpolationMode(Animation::IM_SPLINE);
		else
			pkAnimation->setInterpolationMode(Animation::IM_LINEAR);

		if(strcmp(kRotationIterpolationMode.c_str(),"spherical") == 0)
			pkAnimation->setRotationInterpolationMode(Animation::RIM_SPHERICAL);
		else
			pkAnimation->setRotationInterpolationMode(Animation::RIM_LINEAR);

		NodeAnimationTrack *pkAnimationTrack = pkAnimation->createNodeTrack(
			pkAnimation->getNumNodeTracks() + 1, pkNode);

		for (size_t stKeyframeIndex = 0; stKeyframeIndex < kKeyFrames.size(); stKeyframeIndex++)
		{
			float fTime = kKeyFrames[stKeyframeIndex]->ReadFloat("time");
			FvVector3 kPosition = kKeyFrames[stKeyframeIndex]->ReadVector3("translation");
			FvVector3 kScale = kKeyFrames[stKeyframeIndex]->ReadVector3("scale");
			FvQuaternion kQuaternion = kKeyFrames[stKeyframeIndex]->ReadQuaternion("rotation");
			TransformKeyFrame *pkKeyFrame = pkAnimationTrack->createNodeKeyFrame(fTime);
			pkKeyFrame->setTranslate(Vector3(kPosition.x,kPosition.y,kPosition.z));
			pkKeyFrame->setRotation(Quaternion(kQuaternion.w,kQuaternion.x,kQuaternion.y,kQuaternion.z));
			pkKeyFrame->setScale(Vector3(kScale.x,kScale.y,kScale.z));
		}

		AnimationState *pkAnimationState = pkSceneManager->createAnimationState(pkNode->getName() + kAnimationName);
		pkAnimationState->setEnabled(bEnable);
		pkAnimationState->setLoop(bLoop);
		pkDest->m_kModelAnimations.insert(std::make_pair(kAnimationName,pkAnimationState));
	}
}
Esempio n. 2
0
void WheelAnimalSceneObj::load(const std::string & filename)
{

	//Ogre::ru  * s =  Orz::OgreGraphicsManager::getSingleton().getSceneManager()->getRootSceneNode()->createChildSceneNode(Ogre::Vector3(0, 0 ,0));
	
	//导入场景资源
	_impl = BaseSceneImpl::create(_osm, filename);

	//创建总场景节点
	_senceNode = Orz::OgreGraphicsManager::getSingleton().getSceneManager()->getRootSceneNode()->createChildSceneNode();

	//创建场景
	_osm->createScene(_senceNode);
	_senceNode->setVisible(true);

	//s->setVisible(false);
	/*_impl->getCamera(SCENE_CAMERA)->setPosition(Ogre::Vector3(-98.851, 164.283, 237.886));
	_impl->getCamera(SCENE_CAMERA)->setOrientation(Ogre::Quaternion(0.999578, -0.0192806, -0.0226839));*/

	//创建摄像机的节点
	_cameraSn = OgreGraphicsManager::getSingleton().getSceneManager()->getRootSceneNode()->createChildSceneNode(); 
	
	//获取场景的摄像机
	Ogre::Camera * camera = _impl->getCamera(SCENE_CAMERA);


	//创建摄像机的节点并设置它的位置
	_cameraSn = camera->getParentSceneNode()->createChildSceneNode(Ogre::Vector3(0.f, 164.283f, 237.886f));
	
	
	//_cameraSn->setPosition(Ogre::Vector3(-98.851, 164.283, 237.886));
	//_cameraSn->setOrientation(Ogre::Quaternion(0.999578, -0.0192806, -0.0226839));
	//camera->detatchFromParent();   

	//脱离原有的节点
	camera->detachFromParent();

	//摄像机绑定在节点上
	_cameraSn->attachObject(_impl->getCamera(SCENE_CAMERA));
	
	//创建场景的中心节点
	Ogre::SceneNode * sn =  getBaseCenter()->createChildSceneNode(Ogre::Vector3(0, 100,0));

	//setAutoTracking可以让你的摄像机总是盯着你场景中的某一个节点
	//方法中第一个参数确定是否打开自动跟踪,在任何一帧渲染之前都可以重新设置它。
	//二个参数是被跟踪节点得指针,除非你第一个参数是false(这时候可以用NULL),否则你必须确定调用的时候指针指向的节点必须有效
	camera->setAutoTracking(true, sn);
//	std::cout<<_camera->getPosition()<<"!"<<_camera->getOrientation()<<std::endl;



	//获取场景管理器
	 Ogre::SceneManager * sm = Orz::OgreGraphicsManager::getSingleton().getSceneManager();

	// set up spline animation of node
	 //定义动画,指定动画的名称及长度(这里为4秒)
	_anim = sm->createAnimation("Cam_", 4);

	//// Spline it for nice curves
	// // 指定动画关键帧之间的插值方式(包括线性插值和样条插值)
	_anim->setInterpolationMode(Ogre::Animation::IM_LINEAR);

	//定义动画的一个动画轨迹,并指定这个轨迹是作用到_cameraSn节点上的
	//// Create a track to animate the camera's node
	Ogre::NodeAnimationTrack * track = _anim->createNodeTrack(0, _cameraSn);
											
	 // 定义动画轨迹包含的关键帧,下面定义了3个关键帧,加上起始帧
	// 4个关健帧形成了一个曲线的动画
	Ogre::TransformKeyFrame* key = track->createNodeKeyFrame(0); // startposition
	key->setTranslate(Ogre::Vector3(0.f, 0.3f, 237.886f));

	 key = track->createNodeKeyFrame(3); // startposition
	key->setTranslate(Ogre::Vector3(0.f, 0.3f, 237.886f));

	
	key = track->createNodeKeyFrame(4);
	key->setTranslate(Ogre::Vector3(0.f, -80.f, -400.f));

   //////////////////////////////////
	
	//定义动画的一个动画轨迹,并指定这个轨迹是作用到创建场景的中心节点sn上的
	track = _anim->createNodeTrack(1, sn);
	key = track->createNodeKeyFrame(0); // startposition
	key->setTranslate(Ogre::Vector3(0, 0,0));

	
	key = track->createNodeKeyFrame(3); // startposition
	key->setTranslate(Ogre::Vector3(0, 0,0));

	
	key = track->createNodeKeyFrame(4);
	key->setTranslate(Ogre::Vector3(0, 200,0));										  


	//// Create a new animation state to track this

	//定义AnimationState类的对象,它和刚才定义的动画类相对应。设置动画的状态为启用:
	_animState = sm->createAnimationState("Cam_");
	_animState->setEnabled(true);// 启用该动画
	_animState->setLoop(false);
	/*	Ogre::MaterialPtr material = Ogre::MaterialPtr(Ogre::MaterialManager::getSingleton().getByName("Material_#11/lanseshuijing"));
	material->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("shuijing-lv.dds");*/
}
Esempio n. 3
0
/* Function used to load an AnimationState to a sceneNode.
 * Params:
 * 	@scnManager		the SceneManager
 * 	@node			The SceneNode to load the AnimationStates
 * 	@elem			The TiXmlElement where is the animation
 * Returns:
 * 	anim			On success
 * 	0				On error
 */
bool Util::getAnimation(Ogre::SceneManager *scnManager,
		Ogre::SceneNode *node,
		TiXmlElement *elem,
		std::list<Ogre::AnimationState *> &animList)
{
	ASSERT(scnManager);
	ASSERT(node);
	ASSERT(elem);

	if(Ogre::String(elem->Value()) != "animations") {
		debug("Invalid animation xml: %s \n", elem->Value());
		return false;
	}
	animList.clear();

	TiXmlElement *pElement = elem->FirstChildElement("animation");
	if(!pElement){
		debug("No animations found\n");
		return false;
	}
	while(pElement){
		TiXmlElement *actualElement = pElement;
		Ogre::String nombreanimacion = actualElement->Attribute("name");
		Ogre::String activada = actualElement->Attribute("enable");
		Ogre::String loop = actualElement->Attribute("loop");
		Ogre::String modointerpolacion = actualElement->Attribute("interpolationMode");
		Ogre::String modointerpolacionrotacion = actualElement->Attribute("rotationInterpolationMode");
		Ogre::Real longitud= Ogre::StringConverter::parseReal(actualElement->Attribute("length"));

		Ogre::SceneManager *sceneMgr = scnManager;
		Ogre::Animation *animrueda = sceneMgr->createAnimation(nombreanimacion,longitud);

		if (modointerpolacion == "spline") {
			animrueda->setInterpolationMode(Ogre::Animation::IM_SPLINE);
		} else //linear
		{
			animrueda->setInterpolationMode(Ogre::Animation::IM_LINEAR);
		}

		if (modointerpolacionrotacion == "spherical") {
			animrueda->setRotationInterpolationMode(Ogre::Animation::RIM_SPHERICAL);
		} else //linear
		{
			animrueda->setRotationInterpolationMode(Ogre::Animation::RIM_LINEAR);
		}

		Ogre::NodeAnimationTrack *track = animrueda->createNodeTrack(
				animrueda->getNumNodeTracks() + 1, node);

		actualElement = actualElement->FirstChildElement();
		do {
			Ogre::Real tiempo = Ogre::StringConverter::parseReal(
					actualElement->Attribute("time"));
			Ogre::TransformKeyFrame *kf = track->createNodeKeyFrame(tiempo);

			kf->setTranslate(
					parseVector3(actualElement->FirstChildElement("translation")));
			kf->setRotation(
					parseQuaternion(
							actualElement->FirstChildElement("rotation")));
			kf->setScale(
					parseVector3(
							actualElement->FirstChildElement("scale")));

		} while (actualElement = actualElement->NextSiblingElement());

		// Create the animation and put it in the list
		Ogre::AnimationState *as = scnManager->createAnimationState(nombreanimacion);
		as->setEnabled(false);
		as->setLoop(false);
		ASSERT(as);
		animList.push_back(as);
		pElement = pElement->NextSiblingElement("animation");
	}


	return true;
}