原因わかったあとは「そりゃあそうだよ」って思った。
経緯
oni ファイルを再生するときは、例えば
xn::Context context;
xn::Player player;
context.Init();
context.OpenFileRecording("gongo.oni", player)
みたいなことをしていますが、その後の処理でエラーになります。
xn::DepthGenerator depth;
xn::ImageGenerator image;
context.FindExistingNode(XN_NODE_TYPE_IMAGE, image);
context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth);
depth.GetAlternativeViewPointCap().SetViewPoint(image); // ← ここでエラーステータスが返される
エラー内容を見ると「The node is locked for changes!」でした。
推測
原因を予想すると
- GetAlternativeViewPointCap().SetViewPoint() は depth と image のズレを直してくれる
- 上記では xn::Context では oni ファイルを再生する感じになってる
- 再生しない場合はエラーにならない
- 再生しているデータに対してのズレの修正はできない
勘です。
おそらくドキュメントに載ってるんですかね。ちゃんと探してないです。あるといいな。
補足
ちなみに SetViewPoint() が使えるかどうかってのを確認するには
depth.IsCapabilitySupported(XN_CAPABILITY_ALTERNATIVE_VIEW_POINT)
を実行して TRUE になるかどうかです。