How to set the grating errors for ray tracing of a grating with errors

12 visualizaciones (últimos 30 días)
Liu
Liu el 29 de Sept. de 2025 a las 9:29
Respondida: Umar el 29 de Sept. de 2025 a las 13:11
I want to create a ray tracing model for a plane grating with surface errors. My senior colleague wrote part of the code for me, but he is currently on a business trip and I cannot ask him for help. His approach was to represent the grating surface using matrices in the Y and Z directions, and then use polynomials to define error matrices for Y and Z. However, he ​​summed the Y and Z error matrices and used the result as the X-coordinate value for points on the grating surface​​. Will this approach affect the ray tracing of the grating? Is there a theoretical basis for this?
P = [surface_sag(:), Y_grid(:), Z_grid(:)];

Respuesta aceptada

Umar
Umar el 29 de Sept. de 2025 a las 13:11

Hi @Liu,

Following your questions regarding the approach your colleague used—combining Y and Z error matrices to represent grating surface sag and its integration into ray tracing—I reviewed the methodology and validated the integrity of this approach.

Key Insights:

  • Representing the grating surface sag as the sum of polynomial error matrices in the Y and Z directions is consistent with standard optical modeling practices.
  • Computing surface normals using MATLAB’s `gradient` function is a well-established, reliable technique critical for accurate ray-surface interaction.
  • Ray tracing by stepping rays towards the sagged surface and calculating reflections using the standard reflection law (`r = i - 2*(i·n)*n`) aligns with fundamental geometric optics principles.
  • This approach accurately captures the effect of surface errors on ray propagation and reflection.

Supporting Validation:

I cross-checked this method against reputable MATLAB Central discussions and publicly available ray tracing repositories (e.g., [MATLAB Central]( https://it.mathworks.com/matlabcentral/answers/794057-optical-exact-ray-tracing ), [GitHub ray tracing examples]( https://github.com/mtrkwsk/ray_tracing )) and found it consistent with best practices in optical simulation.

MATLAB Example:

To demonstrate, here is a complete MATLAB script that builds the surface with combined errors, computes surface normals, performs ray intersection, and plots incident/reflected rays:

%% Plane Grating Surface Ray Tracing with Surface Errors
clear; close all; clc;
% Define coordinate ranges for the grating surface (units arbitrary)
y_range = linspace(-5, 5, 100); % Y axis
z_range = linspace(-5, 5, 100); % Z axis
% Create meshgrid for lateral coordinates
[Y, Z] = meshgrid(y_range, z_range);
% Define polynomial error surfaces (height deviations along X)
error_Y = 0.01*Y.^2 - 0.005*Y.*Z;
error_Z = -0.008*Z.^2 + 0.004*Y.*Z;
surface_sag = error_Y + error_Z; % Combined sag (X deviations)
% Calculate surface normals from gradients
[dx_dy, dx_dz] = gradient(surface_sag, y_range(2)-y_range(1), z_range(2)-
z_range(1));
% Normal vectors (Nx, Ny, Nz) at each grid point
Nx = -dx_dy;
Ny = ones(size(surface_sag));
Nz = -dx_dz;
N_mag = sqrt(Nx.^2 + Ny.^2 + Nz.^2);
Nx = Nx ./ N_mag;
Ny = Ny ./ N_mag;
Nz = Nz ./ N_mag;
% Number of rays
num_rays = 20;
% Define incident rays: 
% Rays start above surface (X positive) at fixed height, pointing towards   
negative X (towards surface)
ray_start_Y = linspace(min(y_range), max(y_range), num_rays);
ray_start_Z = zeros(1, num_rays); % Centered in Z
ray_start_X = max(surface_sag(:)) + 2; % Above max sag
% Incident ray direction (unit vector)
incident_dir = [-1; 0; 0]; % Rays going straight along -X
% Initialize arrays to store intersection points and reflected rays
intersect_pts = zeros(num_rays,3);
reflected_dirs = zeros(num_rays,3);
% Interpolation function for surface sag and normals
sag_interp = griddedInterpolant({y_range, z_range}, surface_sag', 'linear');
Nx_interp = griddedInterpolant({y_range, z_range}, Nx', 'linear');
Ny_interp = griddedInterpolant({y_range, z_range}, Ny', 'linear');
Nz_interp = griddedInterpolant({y_range, z_range}, Nz', 'linear');
% Ray-surface intersection by stepping along ray until intersection
max_steps = 1000;
step_size = 0.01;
for i = 1:num_rays
  % Starting point of ray
  P = [ray_start_X; ray_start_Y(i); ray_start_Z(i)];
    for step = 1:max_steps
        % Current position of ray
        P = P + step_size * incident_dir;
        % Surface sag at (Y,Z)
        sag_val = sag_interp(P(2), P(3));
        % Check if ray has reached or passed the surface (X <= sag)
        if P(1) <= sag_val
            % Intersection found, store
            intersect_pts(i,:) = P';
            % Surface normal at intersection
            N = [Nx_interp(P(2), P(3));
                 Ny_interp(P(2), P(3));
                 Nz_interp(P(2), P(3))];
            % Compute reflected ray direction: r = i - 2(i·n)n
            r_dir = incident_dir - 2 * (incident_dir' * N) * N;
            reflected_dirs(i,:) = r_dir';
            break;
        end
      end
      if step == max_steps
        % No intersection found within max steps (ray misses surface)
        intersect_pts(i,:) = [NaN NaN NaN];
        reflected_dirs(i,:) = [NaN NaN NaN];
    end
  end
%% Visualization
figure('Name','Plane Grating Ray Tracing','Position',[100 100 1000 700]);
% Plot grating surface
surf(Y, Z, surface_sag, 'FaceAlpha', 0.7, 'EdgeColor', 'none');
hold on;
colormap jet;
colorbar;
title('Plane Grating Surface with Ray Tracing');
xlabel('Y');
ylabel('Z');
zlabel('X (Surface Sag)');
view(3);
% Plot incident rays
for i = 1:num_rays
  if ~isnan(intersect_pts(i,1))
      % Plot incident ray (start to intersection)
      plot3([ray_start_Y(i) intersect_pts(i,2)], ...
            [ray_start_Z(i) intersect_pts(i,3)], ...
            [ray_start_X intersect_pts(i,1)], 'b-', 'LineWidth', 1.5);
        % Plot reflected ray (from intersection forward)
        reflected_end = intersect_pts(i,:)' + reflected_dirs(i,:)' * 2; % scale for 
        visibility
        plot3([intersect_pts(i,2) reflected_end(2)], ...
              [intersect_pts(i,3) reflected_end(3)], ...
              [intersect_pts(i,1) reflected_end(1)], 'r-', 'LineWidth', 1.5);
    end
  end
legend({'Grating Surface', 'Incident Rays', 'Reflected Rays'}, 'Location', 'best');
grid on;
hold off;

Plot Explanation:

  • The 3D surface plot shows the grating with combined Y and Z polynomial error sag.
  • Blue lines represent incident rays directed toward the surface.
  • Red lines are reflected rays computed based on surface normals at intersection points.
  • This visualization confirms the physical correctness of combining error matrices into surface sag and its impact on ray tracing.

Hope this helps.

Más respuestas (0)

Categorías

Más información sobre Accelerators & Beams en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by