code: def test_dimensions_ray_params(self, device, dtype):
      cameras = create_four_cameras(device, dtype)
      uniform_sampler_four_cameras = UniformRaySampler(
          1, 2, False, device=device, dtype=dtype
      )
      uniform_sampler_four_cameras.calc_ray_params(cameras)
      lengths = sample_lengths(
          uniform_sampler_four_cameras.origins.shape[0],
          10,
          device=device,
          dtype=dtype,
          irregular=True,
      )
      assert uniform_sampler_four_cameras.origins.shape == (
          3 * 28 + 45,
          3,
      )
      assert uniform_sampler_four_cameras.directions.shape == (
          3 * 28 + 45,
          3,
      )
      assert uniform_sampler_four_cameras.camera_ids.shape == (
          3 * 28 + 45,
      )
      assert uniform_sampler_four_cameras.points_2d.shape == (
          3 * 28 + 45,
          2,
      )
      assert lengths.shape == (3 * 28 + 45, 10)
  
imports: import math
  import torch
  from kornia.core import Device
  from kornia.geometry.camera import PinholeCamera
  from kornia.nerf.samplers import RandomGridRaySampler, RandomRaySampler, UniformRaySampler, calc_ray_t_vals, cameras_for_ids, sample_lengths, sample_ray_points
  from kornia.testing import assert_close
label_desc: Use image node_id 2 for calling the TestRaySampler_3DPoints obj's underlying member method code with example usage: obj.test_dimensions_ray_params(device, dtype) without return types