turandai / gaussian_surfels

Implementation of the SIGGRAPH 2024 conference paper "High-quality Surface Reconstruction using Gaussian Surfels".
540 stars 26 forks source link

Custom Dataset Loader and Transformations (W2C, C2W) #38

Closed robofar closed 4 months ago

robofar commented 4 months ago

Hello. I want to write custom dataset loader. Dataset gives position and orientation of camera (in world frame).

I just want to know, for R and T, should I save w2c transformation or c2w transformation. When I say c2w I mean, transformation that is constructed directly from the position and orientation of camera/vehicle given by dataset.

I am asking, because I was trying something, but it did not work. So I want to confirm. Another question, for method getWorld2View2 why you are transposing rotation matrix?

def getWorld2View2(R, t, translate=torch.tensor([0.0, 0.0, 0.0]), scale=1.0):
    translate = translate.to(R.device)
    Rt = torch.zeros((4, 4), device=R.device)

    Rt[:3, :3] = R.transpose(0,1) # why transposed here?
    #Rt[:3, :3] = R # Why not only R?
    Rt[:3, 3] = t
    Rt[3, 3] = 1.0

    C2W = np.linalg.inv(Rt) # so this is correct notation C2W
    cam_center = C2W[:3, 3]
    cam_center = (cam_center + translate) * scale
    C2W[:3, 3] = cam_center
    Rt = np.linalg.inv(C2W)
    return Rt
turandai commented 4 months ago

Hi, different datasets save different format of camera poses, you can choose whatever convenient to you. Here we follow the original pose definition in 3DGS for the Camera class, where R=c2w[:3, :3] and T=w2c[:3, 3]. So in your mentioned getWorld2View2, the R should be transposed to construct Rt=w2c.