「instantNeRFで遊ぶ Advent Calendar 2022」の18日目です。
testbedで起動時のモデルの姿勢を変更する方法を検討しました。クロップや回転が難しくなるので起動時に正対した姿勢にしたいからです。
Q unit cubeを回転させるようにすべてのカメラマトリクスを変更するヒントはありますか?
A 希望するunit cubeの回転に対応する 4x4 の回転行列を取り、すべてのカメラ行列にこれを掛けます。
(DeepLで翻訳しました https://www.deepl.com/ja/translator)
業務外の個人的な検討活動です。
警告
環境や入力内容によっては現在使用できている状況が壊れることがあります。
あなたの責任と判断で試してください。私は責任を取りません。
テストデータ
sketchfabのNefertiti statueを使用させていただきました。ありがとうございます。
transform.json
再掲します。カメラの位置と姿勢はtransform_matrixの名前で同次形のR|Tで保存されているようです。
transformJson.py
colmap2nerf.pyを流用し、各カメラのtransform_matrixを回転させます。transformJson.pyという名前にしました。
スニペット
rot2 = R.from_euler("yzx", args.rotate, degrees=True)
if ref_transforms:
# testbed.fov_axis = 0
# testbed.fov = ref_transforms["camera_angle_x"] * 180 / np.pi
if not args.screenshot_frames:
args.screenshot_frames = range(len(ref_transforms["frames"]))
# print(args.screenshot_frames)
for idx in args.screenshot_frames:
f = ref_transforms["frames"][int(idx)]
cam_matrix = f["transform_matrix"]
# print(cam_matrix)
rot1 = R.from_matrix(
[[cam_matrix[0][0],cam_matrix[0][1],cam_matrix[0][2]],
[cam_matrix[1][0],cam_matrix[1][1],cam_matrix[1][2]],
[cam_matrix[2][0],cam_matrix[2][1],cam_matrix[2][2]]])
rot3 = rot2 * rot1
camMatrix = rot3.as_matrix()
cam_matrix[0][0:3] = camMatrix[0][0:3]
cam_matrix[1][0:3] = camMatrix[1][0:3]
cam_matrix[2][0:3] = camMatrix[2][0:3]
t1 = [cam_matrix[0][3],cam_matrix[1][3],cam_matrix[2][3]]
t2 = np.dot(rot2.as_matrix(), t1)
t2 = t2.T
cam_matrix[0][3] = t2[0]
cam_matrix[1][3] = t2[1]
cam_matrix[2][3] = t2[2]
testbed.exe
そのままのtransfrom.jsonを使うと横倒しでした。
transformJson.pyの実行
ここからz軸に-90deg回すと正対しそうなので、作成したtransformJson.pyに0, 0, -90を入力しました。
(ngp) D:\git\instant-ngp\data>python transformJson.py --rotate 0 0 -90 --screenshot_transforms 221214a\json\221214.json > 221214a\221214R.json
testbed.exe 調整後
新たに生成したjsonファイルを使用しtestbed.exeを実行したところ狙い通り正対して再生されました。
使用しないtransform.jsonは拡張子を変えたり別のフォルダに移しておかないと混ざります。