摘要: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
![]() |
|
