Hi @testure sry about that, before converting it to image, i am facing problems in ray casting, itself.
I have two codes, one that I have created myself, and one that i have searched online and found.
lets me show my code first
####My Code 1
def calculate_rays():
scene = bpy.context.scene
depsgraph = bpy.context.evaluated_depsgraph_get()
rays_casted = 0
hit_distances = []
camera = scene.camera
# Get the dimensions of the render resolution
width = scene.render.resolution_x
height = scene.render.resolution_y
#reducing dimensions
reduction_factor = 10
reduced_width = width // reduction_factor
reduced_height = height // reduction_factor
aspect_ratio = reduced_width / reduced_height
# Get the camera's field of view (FOV) and aspect ratio
fov = camera.data.angle
# Convert camera angle to radians
camera_angle_radians = math.radians(fov)
# Calculate the near plane height based on the FOV and near plane distance
near_plane_height = 2 * camera.data.clip_start * math.tan(camera_angle_radians / 2)
# Calculate the near plane width based on the aspect ratio
near_plane_width = near_plane_height * aspect_ratio
# Define the origin of the rays (camera location) and maximum length of the ray
origin = scene.camera.location
ray_length = 2000 # Increase the ray length
# Get the camera matrix
camera_matrix = scene.camera.matrix_world
# __Init__numpy
hit_distances = np.full((reduced_height, reduced_width), ray_length, dtype=float)
normalized_hit_distances = np.zeros((reduced_height, reduced_width), dtype=float)
# Convert planes to meshes
convert_planes_to_meshes()
# Create a BVH tree from the scene objects
objects = [obj for obj in bpy.data.objects if obj.type == 'MESH']
bvh = bvhtree.BVHTree.FromObject(objects[0], depsgraph)
for obj in bpy.data.objects:
if obj.type == 'MESH':
print(obj.name)
hit_count = 0
# Get the camera location
camera_location = bpy.context.scene.camera.location
for y in range(reduced_height):
for x in range(reduced_width):
# Calculate the normalized device coordinates (NDC)
ndc_x = (((2 * x) / reduced_width) - 1)*aspect_ratio
ndc_y = (((2 * y) / reduced_height) - 1)
# Calculate the view space coordinates
view_x = ndc_x * near_plane_width * 2
view_y = ndc_y * near_plane_height * 2
view_z = -camera.data.clip_start
# Create the direction vector in view space
direction_view = Vector((view_x, view_y, view_z))
# Transform the direction vector from view space to world space
direction_world = (camera_matrix.inverted() @ direction_view).normalized()
# Define a far-away destination point for the ray
destination = origin + direction_world * ray_length
# Perform ray casting using the BVH tree
hit, hit_location,_,_,_,_ = scene.ray_cast(depsgraph, origin, destination)
# Perform ray casting
if hit:
ray_hit_location = hit_location
ray_distance = (hit_location - origin).length
hit_count += 1
else:
ray_distance = ray_length
rays_casted += 1
hit_distances[y,x] = ray_distance
# print(f"Ray Direction: {direction_world}")
# print(f"Ray Origin: {origin}")
print(f"Total hit count: {ray_hit_location}")
print(f"Total hit count: {hit_count}")
print(f"Total rays casted: {rays_casted}")
print(f"Hit distances: {hit_distances}")
ohk, I think in this code, I have made some mistakes in this part, from the calculation of ndc to calculation of Transforming the direction vector from view space to world space, thats why I am not getting correct hits
and the other code is taken and modified, but i dont understand that code image to world space calculation part
def calculate_rays():
scene = bpy.context.scene
depsgraph = bpy.context.evaluated_depsgraph_get()
rays_casted = 0
hit_distances = []
# camera object which defines ray source
cam = bpy.data.objects['Camera']
# get vectors which define view frustum of camera
frame = cam.data.view_frame(scene=bpy.context.scene)
topRight = frame[0]
bottomRight = frame[1]
bottomLeft = frame[2]
topLeft = frame[3]
ray_length = 100
# Get the camera matrix
camera_matrix = scene.camera.matrix_world
# number of pixels in X/Y direction
width = scene.render.resolution_x
height = scene.render.resolution_y
#optimize resolution
reduction_factor = 4
reduced_width = width // reduction_factor
reduced_height = height // reduction_factor
# __Init__numpy
hit_distances = np.full((reduced_height, reduced_width), ray_length, dtype=float)
normalized_hit_distances = np.zeros((reduced_height, reduced_width), dtype=float)
# Convert planes to meshes
convert_planes_to_meshes()
# Create a BVH tree from the scene objects
objects = [obj for obj in bpy.data.objects if obj.type == 'MESH']
bvh = bvhtree.BVHTree.FromObject(objects[0], depsgraph)
for obj in bpy.data.objects:
if obj.type == 'MESH':
print(obj.name)
hit_count = 0
# iterate over all X/Y coordinates
for x in range(reduced_height):
for y in range(reduced_width):
# get current pixel vector from camera center to pixel
pixelVector = Vector((x, y, topLeft[2]))
# rotate that vector according to camera rotation
pixelVector.rotate(cam.matrix_world.to_quaternion())
# calculate direction vector
direction = (pixelVector - cam.location).normalized()
# Apply perspective projection from camera space to world space
direction_world = (cam.matrix_world @ direction).normalized()
#direction_world += cam.location
direction_world *=-1
# Define a far-away destination point for the ray
destination = cam.location + direction_world * ray_length
hit, loc, _, _,_,_ = scene.ray_cast(depsgraph,cam.location, destination)
if hit==(True):
ray_distance = (loc - cam.location).length
hit_count += 1
else:
ray_distance = ray_length
rays_casted += 1
hit_distances[x,y] = ray_distance
print(f"Total hit count: {hit_count}")
print(f"Total rays casted: {rays_casted}")
print(f"Hit distances: {hit_distances}")
I dont understand this code correctly, so I want to first correct my ray casting and then I can create a correct depth image
both the codes are giving differnt hits and can you please tell guide me here