88 lines
4.2 KiB
Python
88 lines
4.2 KiB
Python
# ==============================================================================================================
|
|
# The following snippet demonstrates how to initialize instances of kaolin's pinhole / ortho cameras
|
|
# explicitly.
|
|
# Also review `camera_init_simple` which greatly simplifies the construction methods shown here.
|
|
# ==============================================================================================================
|
|
|
|
import math
|
|
import torch
|
|
from kaolin.render.camera import Camera, CameraExtrinsics, PinholeIntrinsics, OrthographicIntrinsics
|
|
|
|
#################################################################
|
|
# Camera 1: from eye, at, up and focal length (Perspective) #
|
|
#################################################################
|
|
# Build the camera extrinsics object from lookat
|
|
eye = torch.tensor([0.0, 0.0, -1.0], device='cuda') # Camera positioned here in world coords
|
|
at = torch.tensor([0.0, 0.0, 0.0], device='cuda') # Camera observing this world point
|
|
up = torch.tensor([0.0, 1.0, 0.0], device='cuda') # Camera up direction vector
|
|
extrinsics = CameraExtrinsics.from_lookat(eye, at, up)
|
|
|
|
# Build a pinhole camera's intrinsics. This time we use focal length (other useful args: focal_y, x0, y0)
|
|
intrinsics = PinholeIntrinsics.from_focal(width=800, height=600, focal_x=1.0, device='cuda')
|
|
|
|
# Combine extrinsics and intrinsics to obtain the full camera object
|
|
camera_1 = Camera(extrinsics=extrinsics, intrinsics=intrinsics)
|
|
print('--- Camera 1 ---')
|
|
print(camera_1)
|
|
|
|
########################################################################
|
|
# Camera 2: from camera position, orientation and fov (Perspective) #
|
|
########################################################################
|
|
# Build the camera extrinsics object from lookat
|
|
cam_pos = torch.tensor([0.0, 0.0, -1.0], device='cuda')
|
|
cam_dir = torch.tensor([[1.0, 0.0, 0.0],
|
|
[0.0, 1.0, 0.0],
|
|
[0.0, 0.0, 1.0]], device='cuda') # 3x3 orientation within the world
|
|
extrinsics = CameraExtrinsics.from_camera_pose(cam_pos=cam_pos, cam_dir=cam_dir)
|
|
|
|
# Use pinhole camera intrinsics, construct using field-of-view (other useful args: camera_fov_direction, x0, y0)
|
|
intrinsics = PinholeIntrinsics.from_fov(width=800, height=600, fov=math.radians(45.0), device='cuda')
|
|
camera_2 = Camera(extrinsics=extrinsics, intrinsics=intrinsics)
|
|
|
|
print('--- Camera 2 ---')
|
|
print(camera_2)
|
|
|
|
####################################################################
|
|
# Camera 3: camera view matrix, (Orthographic) #
|
|
####################################################################
|
|
# Build the camera extrinsics object from lookat
|
|
world2cam = torch.tensor([[1.0, 0.0, 0.0, 0.5],
|
|
[0.0, 1.0, 0.0, 0.5],
|
|
[0.0, 0.0, 1.0, 0.5],
|
|
[0.0, 0.0, 0.0, 1.0]], device='cuda') # 3x3 orientation within the world
|
|
extrinsics = CameraExtrinsics.from_view_matrix(view_matrix=world2cam)
|
|
|
|
# Use pinhole camera intrinsics, construct using field-of-view (other useful args: camera_fov_direction, x0, y0)
|
|
intrinsics = OrthographicIntrinsics.from_frustum(width=800, height=600, near=-800, far=800,
|
|
fov_distance=1.0, device='cuda')
|
|
camera_3 = Camera(extrinsics=extrinsics, intrinsics=intrinsics)
|
|
|
|
print('--- Camera 3 ---')
|
|
print(camera_3)
|
|
|
|
|
|
##########################################################
|
|
# Camera 4: Combining cameras #
|
|
##########################################################
|
|
# Must be of the same intrinsics type, and non params fields such as width, height, near, far
|
|
# (currently we don't perform validation)
|
|
camera_4 = Camera.cat((camera_1, camera_2))
|
|
|
|
print('--- Camera 4 ---')
|
|
print(camera_4)
|
|
|
|
|
|
##########################################################
|
|
# Camera 5: constructing a batch of cameras together #
|
|
##########################################################
|
|
|
|
# Extrinsics are created using batched tensors. The intrinsics are automatically broadcasted.
|
|
camera_5 = Camera.from_args(
|
|
eye=torch.tensor([[4.0, 4.0, 4.0], [4.0, 4.0, 4.0]]),
|
|
at=torch.tensor([[0.0, 0.0, 0.0], [4.0, 4.0, 4.0]]),
|
|
up=torch.tensor([[0.0, 1.0, 0.0], [4.0, 4.0, 4.0]]),
|
|
width=800, height=600, focal_x=300.0
|
|
)
|
|
|
|
print('--- Camera 5 ---')
|
|
print(camera_5) |