SampleAppSinbad in action!

  • 2408
  • 0
  • 2012-08-15

摘要:SampleAppSinbad in action!

 

這個程式使用SampleBrowser的架構, 不過那個不是重點, 希望之後把它改成一般的OGRE App 架構

它用OpenNI擷取了身形和骨架資料, 然後再套到Sinbad身上, 感覺四肢的動作還不錯, 可以調Smooth參數

 

要改寫, 先來了解SampleBrowser的流程


OgreBites::SampleBrowser::go
	createRoot();
	setup();
		createWindow();
		setupInput();
		locateResources();
		createDummyScene();
		loadResources();
		OgreBites::SampleBrowser::runSample
			OgreBites::SampleContext::runSample(s);
				mWindow->removeAllViewports();
				s->_setup(mWindow, mKeyboard, mMouse, mFSLayer);   // start new sample
				SdkSample::_setup
					locateResources();
					createSceneManager();
					setupView();
					loadResources();
					CharacterSample::setupContent
						mChara = new SinbadCharacterController(mCamera);
							setupBody(cam->getSceneManager());
								mBodyEnt = sceneMgr->createEntity("SinbadBody", "Sinbad.mesh");
								mSword1 = sceneMgr->createEntity("SinbadSword1", "Sword.mesh");
								mSword2 = sceneMgr->createEntity("SinbadSword2", "Sword.mesh");
								mSwordTrail = (RibbonTrail*)sceneMgr->createMovableObject
							setupCamera(cam);
							setupAnimations();
								mBodyEnt->getSkeleton()->setBlendMode(ANIMBLEND_CUMULATIVE);
								setupBone("Humerus.L",q*q2); 設定姿勢
								殺掉動作中的key
								anim->destroyNodeTrack
							rc = initPrimeSensor();
								rc = m_Context.InitFromXmlFile(".\\Data\\openni.xml");
								rc = m_pSessionManager->Initialize(&m_Context, "Click", "RaiseHand");
	mRoot->startRendering();    // start the render loop

 

FrameRenderingQueued的流程


	SampleBrowser::frameRenderingQueued
		SampleContext::frameRenderingQueued
			mCurrentSample->frameRenderingQueued(evt)
				Sample_Character::frameRenderingQueued
							mChara->addTime(evt.timeSinceLastFrame);
								m_Context.WaitNoneUpdateAll();
								m_pSessionManager->Update(&m_Context);									
								UpdateDepthTexture();
								updateBody(deltaTime);
								updateAnimations(deltaTime);
								PSupdateBody(deltaTime);
									pUserSkel.GetSkeletonJointPosition
									transformBone("Stomach",XN_SKEL_TORSO, true);
										newQ = bone->convertWorldToLocalOrientation(newQ);
										bone->setOrientation(newQ*qI);
									transformBone("Waist", XN_SKEL_WAIST);
									transformBone("Root", XN_SKEL_WAIST);
									transformBone("Chest",XN_SKEL_TORSO, true);
									transformBone("Humerus.L",XN_SKEL_LEFT_SHOULDER);
									transformBone("Humerus.R",XN_SKEL_RIGHT_SHOULDER);
									transformBone("Ulna.L",XN_SKEL_LEFT_ELBOW);
									transformBone("Ulna.R",XN_SKEL_RIGHT_ELBOW);
									transformBone("Thigh.L",XN_SKEL_LEFT_HIP);
									transformBone("Thigh.R",XN_SKEL_RIGHT_HIP);
									transformBone("Calf.L",XN_SKEL_LEFT_KNEE);
									transformBone("Calf.R",XN_SKEL_RIGHT_KNEE);
									//do gestures for swards
								updateCamera(deltaTime);
							return SdkSample::frameRenderingQueued(evt);

 

結果學到一個技巧

nRetVal = ONIContext.WaitNoneUpdateAll();

可以不用等任何更新就回傳, 所以我之前的OpenRzNI測試程式也可以改成把WaitNoneUpdateAll放在frameRenderingQueued裏

不需要再開一個thread來等資料

附上Sinbad骨架分析圖(Anatomy of Sinbad.Skeleton)<==For Google Search result

 


Root
	Thigh.R
		Calf.R
			Foot.R
				Toe.R
	Thigh.L
		Calf.L
			Foot.L
				Toe.L
	Waist
		Stomach
			Chest
				Clavicle.R
					Humerus.R
						Ulna.R
							Hand.R
								Handle.R
								ThumbProx.R
									ThumbMed.R
										ThumbDist.R
								IndexFingerProx.R
									IndexFingerMed.R
										IndexFingerDist.R
								MiddleFingerProx.R
									MiddleFingerMed.R
										MiddleFingerDist.R
								RingFingerProx.R
									RingFingerMed.R
										RingFingerDist.R
								PinkyProx.R
									PinkyMed.R
										PinkyDist.R
				Clavicle.L
					Humerus.L
						Ulna.L
							Hand.L
								Handle.L
								ThumbProx.L
									ThumbMed.L
										ThumbDist.L
								IndexFingerProx.L
									IndexFingerMed.L
										IndexFingerDist.L
								MiddleFingerProx.L
									MiddleFingerMed.L
										MiddleFingerDist.L
								RingFingerProx.L
									RingFingerMed.L
										RingFingerDist.L
								PinkyProx.L
									PinkyMed.L
										PinkyDist.L
				Sheath.L
				Sheath.R
				Neck
				Head
					Eye.L
					Eye.R
					Cheek.L
					Cheek.R
					UpperLip
					Brow.R
					Brow.C
					Brow.L
					Jaw
						LowerLip
						TongueBase
							TongueMid
								TongueTip

如程式所見, 這裏我們只用到以下幾個骨架


"Stomach" XN_SKEL_TORSO
"Waist" XN_SKEL_WAIST
"Root" XN_SKEL_WAIST
"Chest" XN_SKEL_TORSO
"Humerus.L" XN_SKEL_LEFT_SHOULDER
"Humerus.R" XN_SKEL_RIGHT_SHOULDER
"Ulna.L" XN_SKEL_LEFT_ELBOW
"Ulna.R" XN_SKEL_RIGHT_ELBOW
"Thigh.L" XN_SKEL_LEFT_HIP
"Thigh.R" XN_SKEL_RIGHT_HIP
"Calf.L" XN_SKEL_LEFT_KNEE
"Calf.R" XN_SKEL_RIGHT_KNEE

 

 

Rz

 

 

 

  Rz     should work (hard)