Thanks Driven Life

日々是感謝

oniファイル再生時に GetAlternativeViewPointCap().SetViewPoint() でエラーが出て困ってた

原因わかったあとは「そりゃあそうだよ」って思った。

経緯

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 になるかどうかです。