「instantNeRFで遊ぶ Advent Calendar 2022」の8日目です。
今日はup directionについて調べてみました。
業務外の個人的な検討活動です。
警告
環境や入力内容によっては現在使用できている状況が壊れることがあります。
あなたの責任と判断で試してください。私は責任を取りません。
transform.json
testbed.exe 従来
マウスの右ボタンを押しながらマウスを動かすとモデルの向きを変更できますが、upの設定内容によっては動かしにくい場合があります。
挙動を調べた結果です。
黄色の矢印がドラッグした方向、赤・緑・青色の矢印がそのときのモデルの動きです。
upを[0,1,0]にしたとき、左右と上下にドラッグしたときのモデルの回転軸が重なっていました。
nerf_loader.cu
transform.jsonのupが読み込まれる部分のコードを見ました。
yがx, zがy, そしてxがzに代入されていました。
したがって、[0,1,0]は[1,0,0]になりますので、マウスの上下のドラッグが左右のドラッグと重なってしまうようです。
testbed.cu
upはcolmap2nerf.pyの中で変更されます。
結果的に変換後の姿勢は出たとこ勝負になってしまうので、今回のようにモデルが横倒しになってしまうことがあります。
下記の部分を追加し、testbedの実行中にモデルの姿勢を変更できるようにしました(正確にはカメラの向きを変える座標かもしれません)。
int up_dir;
if (m_up_dir.x() == 1) up_dir = 0;
if (m_up_dir.y() == 1) up_dir = 1;
if (m_up_dir.z() == 1) up_dir = 2;
ImGui::Text("mouse left-right: "); ImGui::SameLine();
accum_reset |= ImGui::RadioButton("u1", &up_dir, 0); ImGui::SameLine(); ImGui::TextColored({ 0.95f, 0.05f, 0.05f, 1.0 }, "x"); ImGui::SameLine();
accum_reset |= ImGui::RadioButton("u2", &up_dir, 1); ImGui::SameLine(); ImGui::TextColored({ 0.05f, 0.95f, 0.05f, 1.0 }, "y"); ImGui::SameLine();
accum_reset |= ImGui::RadioButton("u3", &up_dir, 2); ImGui::SameLine(); ImGui::TextColored({ 0.05f, 0.05f, 0.95f, 1.0 }, "z");
ImGui::Text("mouse up-down: "); ImGui::SameLine(); ImGui::TextColored({ 0.95f, 0.05f, 0.05f, 1.0 }, "x");
if (up_dir == 0) m_up_dir << 1, 0, 0;
if (up_dir == 1) m_up_dir << 0, 1, 0;
if (up_dir == 2) m_up_dir << 0, 0, 1;
testbed.exe 変更
赤枠で示した部分のラジオボタンが追加されました。
crop aabbを開いてGuizmoを表示していると、回す方向が見えやすくなってさらに便利です。
参考