# Copyright (C) 2023, Computer Vision Lab, Seoul National University, https://cv.snu.ac.kr # # Copyright 2023 LucidDreamer Authors # # Computer Vision Lab, SNU, its affiliates and licensors retain all intellectual # property and proprietary rights in and to this material, related # documentation and any modifications thereto. Any use, reproduction, # disclosure or distribution of this material and related documentation # without an express license agreement from the Computer Vision Lab, SNU or # its affiliates is strictly prohibited. # # For permission requests, please contact robot0321@snu.ac.kr, esw0116@snu.ac.kr, namhj28@gmail.com, jarin.lee@gmail.com. import os import numpy as np import torch def generate_seed(scale, viewangle): # World 2 Camera #### rotate x,y render_poses = [np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0]])] ang = 5 for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.eye(3), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # Turn left posetemp[:3,3:4] = np.array([0,0,0]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) for i,j in zip([-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(-3*ang/180*np.pi), 0, np.sin(-3*ang/180*np.pi)], [0, 1, 0], [-np.sin(-3*ang/180*np.pi), 0, np.cos(-3*ang/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) posetemp[:3,3:4] = np.array([1,0,0]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(3*ang/180*np.pi), 0, np.sin(3*ang/180*np.pi)], [0, 1, 0], [-np.sin(3*ang/180*np.pi), 0, np.cos(3*ang/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) posetemp[:3,3:4] = np.array([-1,0,0]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) # for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): # th, phi = i/180*np.pi, j/180*np.pi # posetemp = np.zeros((3, 4)) # posetemp[:3,:3] = np.matmul(np.eye(3), # np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # posetemp[:3,3:4] = np.array([0,0,1]).reshape(3,1) # * scale # Transition vector # render_poses.append(posetemp) rot_cam=viewangle/3 for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # Turn left posetemp[:3,3:4] = np.array([0,0,0]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) for i,j in zip([-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(-3*ang/180*np.pi), 0, np.sin(-3*ang/180*np.pi)], [0, 1, 0], [-np.sin(-3*ang/180*np.pi), 0, np.cos(-3*ang/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) posetemp[:3,3:4] = np.array([0,0,1]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(3*ang/180*np.pi), 0, np.sin(3*ang/180*np.pi)], [0, 1, 0], [-np.sin(3*ang/180*np.pi), 0, np.cos(3*ang/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) posetemp[:3,3:4] = np.array([0,0,-1]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) # for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): # th, phi = i/180*np.pi, j/180*np.pi # posetemp = np.zeros((3, 4)) # posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), # np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # posetemp[:3,3:4] = np.array([1,0,0]).reshape(3,1) # * scale # Transition vector # render_poses.append(posetemp) rot_cam=viewangle*2/3 for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # Turn left posetemp[:3,3:4] = np.array([0,0,0]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) for i,j in zip([-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(-3*ang/180*np.pi), 0, np.sin(-3*ang/180*np.pi)], [0, 1, 0], [-np.sin(-3*ang/180*np.pi), 0, np.cos(-3*ang/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) posetemp[:3,3:4] = np.array([-1,0,0]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(3*ang/180*np.pi), 0, np.sin(3*ang/180*np.pi)], [0, 1, 0], [-np.sin(3*ang/180*np.pi), 0, np.cos(3*ang/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) posetemp[:3,3:4] = np.array([1,0,0]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) # for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): # th, phi = i/180*np.pi, j/180*np.pi # posetemp = np.zeros((3, 4)) # posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), # np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # posetemp[:3,3:4] = np.array([0,0,-1]).reshape(3,1) # * scale # Transition vector # render_poses.append(posetemp) rot_cam=viewangle for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # Turn left posetemp[:3,3:4] = np.array([0,0,0]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) for i,j in zip([-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(-3*ang/180*np.pi), 0, np.sin(-3*ang/180*np.pi)], [0, 1, 0], [-np.sin(-3*ang/180*np.pi), 0, np.cos(-3*ang/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) posetemp[:3,3:4] = np.array([0,0,-1]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,ang,ang,ang,ang,0,-ang,-ang,-ang,-ang,-ang,0,0,0,0]): th, phi = i/180*np.pi, j/180*np.pi posetemp = np.zeros((3, 4)) posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), np.matmul(np.array([[np.cos(3*ang/180*np.pi), 0, np.sin(3*ang/180*np.pi)], [0, 1, 0], [-np.sin(3*ang/180*np.pi), 0, np.cos(3*ang/180*np.pi)]]), np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]])))) posetemp[:3,3:4] = np.array([0,0,1]).reshape(3,1) # * scale # Transition vector render_poses.append(posetemp) # for i,j in zip([ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,ang,2*ang,3*ang,2*ang,ang,0], [0,0,0,ang,2*ang,3*ang,2*ang,ang,0,-ang,-2*ang,-3*ang,-2*ang,-ang,0,0,0,0]): # th, phi = i/180*np.pi, j/180*np.pi # posetemp = np.zeros((3, 4)) # posetemp[:3,:3] = np.matmul(np.array([[np.cos(rot_cam/180*np.pi), 0, np.sin(rot_cam/180*np.pi)], [0, 1, 0], [-np.sin(rot_cam/180*np.pi), 0, np.cos(rot_cam/180*np.pi)]]), # np.matmul(np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]), np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]))) # posetemp[:3,3:4] = np.array([-1,0,0]).reshape(3,1) # * scale # Transition vector # render_poses.append(posetemp) render_poses.append(np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0]])) render_poses = np.stack(render_poses, axis=0) return render_poses def generate_seed_360(viewangle, n_views): N = n_views render_poses = np.zeros((N, 3, 4)) for i in range(N): th = (viewangle/N)*i/180*np.pi render_poses[i,:3,:3] = np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]) render_poses[i,:3,3:4] = np.random.randn(3,1)*0.0 # Transition vector return render_poses def generate_seed_360_half(viewangle, n_views): N = n_views // 2 halfangle = viewangle / 2 render_poses = np.zeros((N*2, 3, 4)) for i in range(N): th = (halfangle/N)*i/180*np.pi render_poses[i,:3,:3] = np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]) render_poses[i,:3,3:4] = np.random.randn(3,1)*0.0 # Transition vector for i in range(N): th = -(halfangle/N)*i/180*np.pi render_poses[i+N,:3,:3] = np.array([[np.cos(th), 0, np.sin(th)], [0, 1, 0], [-np.sin(th), 0, np.cos(th)]]) render_poses[i+N,:3,3:4] = np.random.randn(3,1)*0.0 # Transition vector return render_poses def generate_seed_preset(): degsum = 60 thlist = np.concatenate((np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:])) philist = np.concatenate((np.linspace(0,0,7), np.linspace(-22.5,-22.5,7), np.linspace(22.5,22.5,7))) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[i,:3,3:4] = np.zeros((3,1)) return render_poses def generate_seed_newpreset(): degsum = 60 thlist = np.concatenate((np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:])) philist = np.concatenate((np.linspace(0,0,7), np.linspace(22.5,22.5,7))) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[i,:3,3:4] = np.zeros((3,1)) return render_poses def generate_seed_horizon(): movement = np.linspace(0, 5, 11) render_poses = np.zeros((len(movement), 3, 4)) for i in range(len(movement)): render_poses[i,:3,:3] = np.eye(3) render_poses[i,:3,3:4] = np.array([[-movement[i]], [0], [0]]) return render_poses def generate_seed_backward(): movement = np.linspace(0, 5, 11) render_poses = np.zeros((len(movement), 3, 4)) for i in range(len(movement)): render_poses[i,:3,:3] = np.eye(3) render_poses[i,:3,3:4] = np.array([[0], [0], [movement[i]]]) return render_poses def generate_seed_arc(): degree = 5 # thlist = np.array([degree, 0, 0, 0, -degree]) thlist = np.arange(0, degree, 5) + np.arange(0, -degree, 5)[1:] phi = 0 render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] d = 4.3 # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[0,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector # render_poses[i,:3,3:4] = np.zeros((3,1)) return render_poses def generate_seed_hemisphere(center_depth, degree=5): degree = 5 thlist = np.array([degree, 0, 0, 0, -degree]) philist = np.array([0, -degree, 0, degree, 0]) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] # curr_pose = np.zeros((1, 3, 4)) d = center_depth # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[0,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector # render_poses[i,:3,3:4] = np.zeros((3,1)) return render_poses def generate_seed_hemisphere_(degree, nviews): # thlist = np.array([degree, 0, 0, 0, -degree]) # philist = np.array([0, -degree, 0, degree, 0]) thlist = degree * np.sin(np.linspace(0, 2*np.pi, nviews)) philist = degree * np.cos(np.linspace(0, 2*np.pi, nviews)) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] # curr_pose = np.zeros((1, 3, 4)) d = 4.3 # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[0,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector return render_poses def generate_seed_nothing(): degree = 5 thlist = np.array([0]) philist = np.array([0]) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] # curr_pose = np.zeros((1, 3, 4)) d = 4.3 # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[0,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector # render_poses[i,:3,3:4] = np.zeros((3,1)) return render_poses def generate_seed_lookaround(): degsum = 60 thlist = np.concatenate((np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:])) philist = np.concatenate((np.linspace(0,0,7), np.linspace(22.5,22.5,7), np.linspace(-22.5,-22.5,7))) assert len(thlist) == len(philist) render_poses = [] # up / left --> right thlist = np.linspace(-degsum, degsum, 2*degsum+1) for i in range(len(thlist)): render_pose = np.zeros((3,4)) th = thlist[i] phi = 22.5 render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_pose[:3,3:4] = np.zeros((3,1)) render_poses.append(render_pose) # right / up --> center phlist = np.linspace(22.5, 0, 23) # Exclude first frame (same as last frame before) phlist = phlist[1:] for i in range(len(phlist)): render_pose = np.zeros((3,4)) th = degsum phi = phlist[i] render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_pose[:3,3:4] = np.zeros((3,1)) render_poses.append(render_pose) # center / right --> left thlist = np.linspace(degsum, -degsum, 2*degsum+1) thlist = thlist[1:] for i in range(len(thlist)): render_pose = np.zeros((3,4)) th = thlist[i] phi = 0 render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_pose[:3,3:4] = np.zeros((3,1)) render_poses.append(render_pose) # left / center --> down phlist = np.linspace(0, -22.5, 23) phlist = phlist[1:] for i in range(len(phlist)): render_pose = np.zeros((3,4)) th = -degsum phi = phlist[i] render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_pose[:3,3:4] = np.zeros((3,1)) render_poses.append(render_pose) thlist = np.linspace(-degsum, degsum, 2*degsum+1) for i in range(len(thlist)): render_pose = np.zeros((3,4)) th = thlist[i] phi = -22.5 render_pose[:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_pose[:3,3:4] = np.zeros((3,1)) render_poses.append(render_pose) return render_poses def generate_seed_lookdown(): degsum = 60 thlist = np.concatenate((np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:], np.linspace(0, degsum, 4), np.linspace(0, -degsum, 4)[1:])) philist = np.concatenate((np.linspace(0,0,7), np.linspace(-22.5,-22.5,7))) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[i,:3,3:4] = np.zeros((3,1)) return render_poses def generate_seed_back(): movement = np.linspace(0, 5, 101) render_poses = [] # np.zeros((len(movement), 3, 4)) for i in range(len(movement)): render_pose = np.zeros((3,4)) render_pose[:3,:3] = np.eye(3) render_pose[:3,3:4] = np.array([[0], [0], [movement[i]]]) render_poses.append(render_pose) movement = np.linspace(5, 0, 101) movement = movement[1:] for i in range(len(movement)): render_pose = np.zeros((3,4)) render_pose[:3,:3] = np.eye(3) render_pose[:3,3:4] = np.array([[0], [0], [movement[i]]]) render_poses.append(render_pose) return render_poses def generate_seed_llff(degree, nviews, round=4, d=2.3): assert round%4==0 # thlist = np.array([degree, 0, 0, 0, -degree]) # philist = np.array([0, -degree, 0, degree, 0]) # d = 2.3 thlist = degree * np.sin(np.linspace(0, 2*np.pi*round, nviews)) philist = degree * np.cos(np.linspace(0, 2*np.pi*round, nviews)) zlist = d/15 * np.sin(np.linspace(0, 2*np.pi*round//4, nviews)) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] z = zlist[i] # curr_pose = np.zeros((1, 3, 4)) # d = 4.3 # 얘를 조절하면 초기 자세 기준으로 앞으로 d만큼 떨어진 점을 기준으로 도는 자세가 만들어짐 render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[i,:3,3:4] = np.array([d*np.sin(th/180*np.pi), 0, -z+d-d*np.cos(th/180*np.pi)]).reshape(3,1) + np.array([0, d*np.sin(phi/180*np.pi), -z+d-d*np.cos(phi/180*np.pi)]).reshape(3,1)# Transition vector return render_poses def generate_seed_headbanging(maxdeg, nviews_per_round, round=3, fullround=1): radius = np.concatenate((np.linspace(0, maxdeg, nviews_per_round*round), maxdeg*np.ones(nviews_per_round*fullround), np.linspace(maxdeg, 0, nviews_per_round*round))) thlist = 2.66*radius * np.sin(np.linspace(0, 2*np.pi*(round+fullround+round), nviews_per_round*(round+fullround+round))) philist = radius * np.cos(np.linspace(0, 2*np.pi*(round+fullround+round), nviews_per_round*(round+fullround+round))) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[i,:3,3:4] = np.zeros((3,1)) return render_poses def generate_seed_headbanging_circle(maxdeg, nviews_per_round, round=3, fullround=1): radius = np.concatenate((np.linspace(0, maxdeg, nviews_per_round*round), maxdeg*np.ones(nviews_per_round*fullround), np.linspace(maxdeg, 0, nviews_per_round*round))) thlist = 2.66*radius * np.sin(np.linspace(0, 2*np.pi*(round+fullround+round), nviews_per_round*(round+fullround+round))) philist = radius * np.cos(np.linspace(0, 2*np.pi*(round+fullround+round), nviews_per_round*(round+fullround+round))) assert len(thlist) == len(philist) render_poses = np.zeros((len(thlist), 3, 4)) for i in range(len(thlist)): th = thlist[i] phi = philist[i] render_poses[i,:3,:3] = np.matmul(np.array([[np.cos(th/180*np.pi), 0, -np.sin(th/180*np.pi)], [0, 1, 0], [np.sin(th/180*np.pi), 0, np.cos(th/180*np.pi)]]), np.array([[1, 0, 0], [0, np.cos(phi/180*np.pi), -np.sin(phi/180*np.pi)], [0, np.sin(phi/180*np.pi), np.cos(phi/180*np.pi)]])) render_poses[i,:3,3:4] = np.zeros((3,1)) return render_poses def get_pcdGenPoses(pcdgenpath, argdict={}): if pcdgenpath == 'rotate360': render_poses = generate_seed_360(360, 10) elif pcdgenpath == 'lookaround': render_poses = generate_seed_preset() elif pcdgenpath == 'moveright': render_poses = generate_seed_horizon() elif pcdgenpath == 'moveback': render_poses = generate_seed_backward() elif pcdgenpath == 'arc': render_poses = generate_seed_arc() elif pcdgenpath == 'lookdown': render_poses = generate_seed_newpreset() elif pcdgenpath == 'hemisphere': render_poses = generate_seed_hemisphere(argdict['center_depth']) else: raise("Invalid pcdgenpath") return render_poses def get_camerapaths(): preset_json = {} for cam_path in ["back_and_forth", "llff", "headbanging"]: if cam_path == 'back_and_forth': render_poses = generate_seed_back() elif cam_path == 'llff': render_poses = generate_seed_llff(5, 400, round=4, d=2) elif cam_path == 'headbanging': render_poses = generate_seed_headbanging(maxdeg=15, nviews_per_round=180, round=2, fullround=0) else: raise("Unknown pass") yz_reverse = np.array([[1,0,0], [0,-1,0], [0,0,-1]]) blender_train_json = {"frames": []} for render_pose in render_poses: curr_frame = {} ### Transform world to pixel Rw2i = render_pose[:3,:3] Tw2i = render_pose[:3,3:4] # Transfrom cam2 to world + change sign of yz axis Ri2w = np.matmul(yz_reverse, Rw2i).T Ti2w = -np.matmul(Ri2w, np.matmul(yz_reverse, Tw2i)) Pc2w = np.concatenate((Ri2w, Ti2w), axis=1) Pc2w = np.concatenate((Pc2w, np.array([0,0,0,1]).reshape((1,4))), axis=0) curr_frame["transform_matrix"] = Pc2w.tolist() blender_train_json["frames"].append(curr_frame) preset_json[cam_path] = blender_train_json return preset_json def main(): cam_path = 'headbanging_circle' os.makedirs("poses_supplementary", exist_ok=True) if cam_path == 'lookaround': render_poses = generate_seed_lookaround() elif cam_path == 'back': render_poses = generate_seed_back() elif cam_path == '360': render_poses = generate_seed_360(360, 360) elif cam_path == '1440': render_poses = generate_seed_360(360, 1440) elif cam_path == 'llff': d = 8 render_poses = generate_seed_llff(5, 400, round=4, d=d) elif cam_path == 'headbanging': round=3 render_poses = generate_seed_headbanging_(maxdeg=15, nviews_per_round=180, round=round, fullround=0) elif cam_path == 'headbanging_circle': round=2 render_poses = generate_seed_headbanging_circle(maxdeg=5, nviews_per_round=180, round=round, fullround=0) yz_reverse = np.array([[1,0,0], [0,-1,0], [0,0,-1]]) c2w_poses = [] for render_pose in render_poses: ### Transform world to pixel Rw2i = render_pose[:3,:3] Tw2i = render_pose[:3,3:4] # Transfrom cam2 to world + change sign of yz axis Ri2w = np.matmul(yz_reverse, Rw2i).T Ti2w = -np.matmul(Ri2w, np.matmul(yz_reverse, Tw2i)) Pc2w = np.concatenate((Ri2w, Ti2w), axis=1) # Pc2w = np.concatenate((Pc2w, np.array([[0,0,0,1]])), axis=0) c2w_poses.append(Pc2w) c2w_poses = np.stack(c2w_poses, axis=0) # np.save(f'poses_supplementary/{cam_path}.npy', c2w_poses) FX = 5.8269e+02 W = 512 fov_x = 2*np.arctan(W / (2*FX)) if cam_path in ['360', '1440', 'llff', 'headbanging']: fov_x = fov_x * 1.2 blender_train_json = {} blender_train_json["camera_angle_x"] = fov_x blender_train_json["frames"] = [] for render_pose in render_poses: curr_frame = {} ### Transform world to pixel Rw2i = render_pose[:3,:3] Tw2i = render_pose[:3,3:4] # Transfrom cam2 to world + change sign of yz axis Ri2w = np.matmul(yz_reverse, Rw2i).T Ti2w = -np.matmul(Ri2w, np.matmul(yz_reverse, Tw2i)) Pc2w = np.concatenate((Ri2w, Ti2w), axis=1) curr_frame["transform_matrix"] = Pc2w.tolist() (blender_train_json["frames"]).append(curr_frame) import json if cam_path=='llff': train_json_path = f"poses_supplementary/{cam_path}_d{d}.json" elif cam_path=='headbanging': train_json_path = f"poses_supplementary/{cam_path}_r{round}.json" else: train_json_path = f"poses_supplementary/{cam_path}.json" with open(train_json_path, 'w') as outfile: json.dump(blender_train_json, outfile, indent=4) if __name__ == '__main__': main()