Simulation of European Extremely Large Telescope ("ELT")

ELT telescope is really huge and exceptional. I tried to model the mirror and then simulate the rays. I don’t think I have the last coefficient for the optics has some of the last coefficients are not the same on the ESO website, but as I need all parameters (see image at the end) I can’t use them. The ray converge to a 10 mm radius, I don’t know if it is correct or if there is a slight error somewhere.

Three mirror are aspheric so there are defined by coefficients that link the Z to the radius
Z=\frac{r²/R}{1+\sqrt{1-(K+1)r²/R²}}+A r^4+B r^6
So I calculate Z for various radius, make an interpolation curve then I revolve this curve.
I just made a little C# to calculate the perfect ray reflection.

[1] E-ELT Optomechanics: Overview
M. Cayrel European Southern Observatory (ESO), Karl-Schwarzschild-Strasse. 2, Garching, Germany


Very interesting.
May I ask what project is this? and whom you are working for?

Why were so many intermediate mirrors used? It would seem that every time you introduce a new reflecting surface you have a chance of multiplying errors.

I am working for nobody I just questioned myself if a 3d model of the ELT was worth to be published on Turbosquid (I have already some other models on this platform). Before doing a model I search for information, drawings … and because I like to make things the most accurate I search for the optics. I found that interesting and I wanted to place the optics with the good distance and test if my model was realistic.
I am not very pleased with my Grasshopper script, not enough generic and simple. I will be happy to have a sort of description of the optics and an automatic Grasshopper to make it. But if you want to try I can publish it.

I am not an optic specialist but this telescope have many adaptive optics to cope with air turbulence, deformations of mirror (wind, heat …) and also to make the focus. There were lot of studies with differents optics configuration, size … and they choose this configuration.

This kind of telescope is named " Nasmyth Telescope’"

All the information on this telescope


The Wikipedia page also seems a good overview to me. :slight_smile:

Hi Lauerent,
Awesome work. I can’t tell for sure but your rays should focus to a point if not you might have errors in one of your mirrors surfaces. Also can’t tell from your pic but the focal distance of the observer might be shorter closer to the scope sorry it’s hard to tell. When I have the time I want to build a Tri sheifspiegler. Thanks for posting can’t wait to see images from that scope it’s suppose to out perform the Hubble.

Hi Roland

Yeah. :grinning:

But I think we’ll have to wait a little … :confused: :wink:

Hi Emilio,
Thanks for that link I bookmarked it. I’d been to the page but didn’t realize they had these webcams.

1 Like

Hello Laurent,
I really hope this is not to unusual to revive this old topic, but I am really out of options at this point.
The rays from these two pictures seem to be very perfect. I have tried to build some of my own using Mosquito, which unfortunately this seems to be inaccurate, since its bending the ray in a plane that I really didnt give it any vector for.
I have read the grey links beneath your initial post. One seems to suggest that I need to use some C# Code, that I tried to implement, but it gives me errors.
Ive also tried Ladybug and the “Bounce off surface” component, but that seems to never give me parallel rays from the direction I need and also more errors.

Could you please tell me how to generate those?

It is for a telescope project and I intend to use the Galapagos solver on it.

Thanks in advance!

here is the script, it is very simple but uses only SURFACES.Mirror is done using equation that make curve that is revolved.
and provide some lines.
telescope reflexion on (16.1 KB)

 private void RunScript(List<Surface> surfaces, List<Line> linesRay, double maxDist, ref object A)
    double distanceMax = 100000;
    double tolerance = 0.001;
    double distanceNoIntersection = maxDist;

    List<Polyline> lst_polylines = new  List<Polyline>();

    foreach (Line lineRay in linesRay)
      List<Point3d> lst_points = new  List<Point3d>();

      Line actualRay = lineRay;
      foreach (Surface surface in surfaces)
        Line lineReflection = RaySurfaceReflexion(surface, actualRay, distanceMax, tolerance);

        if (lineReflection != Line.Unset)
          actualRay = lineReflection;
          lst_points.Add(actualRay.From + actualRay.Direction * distanceNoIntersection);

      lst_points.Add(actualRay.From + actualRay.Direction * distanceNoIntersection);
      lst_polylines.Add(new Polyline(lst_points));

    A = lst_polylines;


  // <Custom additional code> 

  public Line RaySurfaceReflexion(Surface surface, Line ray, double distanceMax, double tolerance)

    Line lineRay = new Line(ray.From, ray.Direction, distanceMax);
    Line lineOut = Line.Unset;

    Curve curve = lineRay.ToNurbsCurve();
    CurveIntersections cis = Rhino.Geometry.Intersect.Intersection.CurveSurface(curve, surface, tolerance, tolerance);
    if (cis.Count > 0)
      double minParameter = double.MaxValue;
      foreach (IntersectionEvent ci in cis)
        if (ci.ParameterA < minParameter)
          minParameter = ci.ParameterA;
      if (minParameter >= 0)
        Point3d pointIntersection = curve.PointAt(minParameter);
        double u, v;
        surface.ClosestPoint(pointIntersection, out u, out v);

        Plane frame = Plane.WorldXY;
        surface.FrameAt(u, v, out frame);
        Vector3d reflexion = Reflexion(ray.Direction, frame.Normal);
        lineOut = new Line(pointIntersection, reflexion, 1);
    return lineOut;

  Vector3d Reflexion(Vector3d ray, Vector3d normal)


    return ray - 2.0 * (ray * normal) * normal;


Ray tracing on a surface in Grasshopper Python – Singapore Hawker Centre (

import rhinoscriptsyntax as rs
import Rhino.Geometry as rg
import random
import math

seed_string = "ourrandommagicformula" + str(seed)

ray_polylines = []

direction = rg.Vector3d(-1, -1, -1)
direction.Rotate(math.radians(angle_x), rg.Vector3d.XAxis)
direction.Rotate(math.radians(angle_y), rg.Vector3d.XAxis)

for i in range(nr_of_rays):
    ran_x = random.uniform(-jitter, jitter)
    ran_y = random.uniform(-jitter, jitter)
    ran_z = random.uniform(-jitter, jitter)
    ran_vec = rg.Vector3d(ran_x, ran_y, ran_z)
    ray_direction = direction + ran_vec
    ref_pts =rs.ShootRay(surfaces, source, ray_direction, reflections)
    if ref_pts != None:
        ray_polyline = rs.AddPolyline(ref_pts)

and @PeterFotiadis share this raytracing script couple of years back >> Issue with multiple trimmed surfaces - #21 by PeterFotiadis

Thank you very much, @laurent_delrieu
It was still a hassle to make it work since i got exactly 0 experience with the c# component, nor programming at all. I am so thankful for this forum. Thanks again! :star_struck:

@crz_06 Thanks to you too, crz! I made the other one work already but will keep this method in mind, for the times my newly acquired wont work! :slight_smile: