Solidi definiti da funzioni matematiche.
Renderizzati nel browser di chi guarda.

Nessuna mesh, nessun triangolo, nessun dato geometrico salvato. Un solido e una funzione f(x,y,z): il segno decide pieno o vuoto, lo zero e la superficie, il gradiente e la normale. Il raggio non cerca: la funzione dichiara dove viene colpita, in forma chiusa.

Intersezione analitica Superficie = livello zero di f Normale = gradiente Zoom che mantiene il rapporto 100% client-side API HTTP sempre disponibile

Il motore gira nel browser

Nessun server calcola immagini. Il rendering avviene sul dispositivo di chi visita: il sito e una cartella statica.

API HTTP in PHP, sempre attiva

Gli stessi endpoint di openapi.yaml rispondono su /interseca, /render, /scena. Nessuna scheda da tenere aperta: il server calcola. Stessa precisione di JS (IEEE 754 double).

La funzione dice dov'e

Sfera, piano e cubo rispondono con t in forma chiusa. Nessun passo a tentoni, nessuna approssimazione di ricerca.

Verifica Delta = 0

La pagina Verifica manda la stessa domanda a PHP e a JS e confronta i numeri esattamente. Se divergono, lo dice. E il controllo di UNISEFE CORE applicato al porting.

Prestazioni misurate dal vivo

La pagina Prestazioni misura raggi/secondo e ms/frame sul tuo dispositivo, in tempo reale.

Le scene sono documenti

POST /scena salva la scena e restituisce un id che e l'hash del contenuto. Stesso contenuto, stesso id. GET /scena/{id} restituisce il documento intero e verifica l'hash.

Il motore in azione

Trascina = orbita. Rotella sopra un punto = quel punto resta fermo. Shift+trascina = spostamento. Mouse fermo su un solido = sonda.

Uso minimo (libreria JS)

La libreria e una sola: geometry.js. Espone window.AICAD (e window.GEOMETRY come alias).

// 1. costruisci la scena
const sc = AICAD.scene([
  AICAD.sphere(0, 1.6, 0, 1.6, [0.36,0.62,0.95]),
  AICAD.planeY(0, [0.17,0.20,0.25])
]);

// 2. definisci la camera
const cam = AICAD.camera({ dist: 9.5, fov: 0.84 });

// 3. chiedi al solido dove lo colpisci
const r = cam.ray(0, 0, 1.6);
const hit = sc.trace(r.o, r.d);

// hit = { t, p, obj, normal }
// La superficie e il livello zero:
// f(punto) = 0  ->  sei sulla superficie
// f(punto) < 0  ->  pieno
// f(punto) > 0  ->  vuoto

// La normale non si stima: si calcola.
// Per la sfera e il raggio dal centro.

// Perfino il colore, in futuro, sara
// una funzione g(punto, normale).

Uso da un'AI (API HTTP)

Le stesse operazioni, come richieste HTTP. Sempre disponibili, senza aprire nessuna pagina.

# il raggio non cerca: la funzione dichiara
curl -s -X POST \
  https://aicadapi.unisefe.it/api.php?r=interseca \
  -H 'Content-Type: application/json' \
  -d '{"solido":{"tipo":"sfera",
        "centro":[0,1.6,0],"raggio":1.6},
      "origine":[0,1.6,8],
      "direzione":[0,0,-1]}'

# -> {"colpito":true,"t":6.4, ...}
# la scena e un documento: id = hash del contenuto
curl -s -X POST \
  https://aicadapi.unisefe.it/api.php?r=scena \
  -H 'Content-Type: application/json' \
  -d '{"scena":[{"tipo":"sfera",
        "centro":[0,1.6,0],"raggio":1.6}]}'

# -> {"ok":true,"id":"a1b2c3...","url":"/scena/a1b2c3..."}