Gli amici delle sub-D

Un saluto a tutti.
Come noto una curva, per essere “sub-D friendly”, deve soddisfare alcuni criteri.
In particolare occorre la collinearità dei primi (e ultimi) tre CV e una loro disposizione spaziale piuttosto curiosa: la distanza tra il primo e il secondo CV deve essere un terzo della distanza tra il primo e il terzo CV.
Ma perché questa regola?

Cominciamo a vedere innanzitutto perché non è sufficiente la “semplice” collinearità dei primi tre punti di controllo nonostante ci garantisca, da sola, una curvatura nulla all’estremo della curva.
Penso che, se la derivata seconda non fosse nulla all’estremo, dopo un istante infinitesimo, potrebbe accadere che la variazione della curvatura subisca uno strappo (dovrebbe chiamarsi jerk) che potrebbe risultare sgradevole in una superficie dove è richiesta una transizione fluida.
Abbiamo avuto modo di vedere più volte che la curvatura e la derivata seconda sono due cose differenti.
La formula della curvatura è:

\kappa = \frac{\|\mathbf{C}' \times \mathbf{C}''\|}{\|\mathbf{C}'\|^3}

Il primo vincolo, come detto, è la collinearità dei primi tre punti di controllo P_0, P_1 e P_2, ma perché?
Perché se questi punti giacciono sulla stessa retta, i vettori della derivata prima \mathbf{C}' e della derivata seconda \mathbf{C}'' risultano paralleli.
Di conseguenza, il loro prodotto vettoriale è nullo, rendendo la curvatura \kappa = 0.

Ma vediamo l’annullamento della derivata seconda che mi pare la questione meno intuitiva, per lo meno per me.
Credo che, mentre la collinearità garantisce la forma (continuità geometrica), la compatibilità Sub-D richiede anche la continuità matematica (parametrica).
Questo si ottiene azzerando il vettore della derivata seconda all’origine \mathbf{C}''(0) = \vec{0}.

In una curva B-spline clamped, la derivata seconda è definibile come:

\mathbf{C}''(0) = \frac{p(p-1)}{u_{p+1}} \left( \frac{P_2 - P_1}{u_{p+2}} - \frac{P_1 - P_0}{u_{p+1}} \right)

Affinché tale valore sia nullo, deve necessariamente annullarsi l’espressione tra parentesi.
Ma visto che il coefficiente moltiplicativo \frac{p(p-1)}{u_{p+1}} è un valore scalare costante, l’unico modo per annullare il vettore \mathbf{C}''(0) è che il termine tra parentesi sia zero.
Definendo d_1 la distanza tra P_0 e P_1, e d_2 la distanza tra P_1 e P_2, otteniamo la condizione fondamentale:

\frac{d_1}{d_2} = \frac{u_{p+1}}{u_{p+2}}

Notiamo subito l’invarianza dal grado della curva!
L’annullamento della derivata seconda non dipende pertanto dal grado p della curva.
Il coefficiente p(p-1) moltiplica l’intero termine, ma non influisce sulla posizione di equilibrio dei punti.
Pertanto, il rapporto tra le distanze dei punti di controllo dipende esclusivamente dalla struttura del vettore dei nodi.
Il comportamento della curva cambia infatti radicalmente a seconda che la distribuzione dei nodi sia uniforme o meno.

Analizziamo il caso in cui il vettore dei nodi sia uniforme, che poi è il caso di reale interesse visto che, nelle implementazioni Sub-D standard (Catmull-Clark?), è richiesto espressamente.

I primi due nodi non nulli sono u_{p+1} = 1 e u_{p+2} = 2.

Sostituendo quindi nella formula:

\frac{d_1}{d_2} = \frac{1}{2} \implies d_2 = 2d_1

Se consideriamo la lunghezza totale L del segmento che unisce P_0 a P_2, si deduce che d_1 deve essere 1/3 di L, mentre d_2 deve essere i 2/3 di L.
Questo è il famoso rapporto 1/3 - 2/3 che garantisce la perfetta compatibilità con le superfici di suddivisione.

Ecco quindi il perché della regola!!! :-))

Dovrebbe essere intuitivo cosa accade nel caso in cui il vettore dei nodi non sia uniforme.
Se i nodi non sono uniformi, il rapporto spaziale dei punti di controllo deve cambiare per compensare la differente velocità del parametro.
Ad esempio, se u_{p+1} = 1 e u_{p+2} = 5, il rapporto dovrà essere d_1/d_2 = 1/5. Senza questo adattamento, la curva subirebbe un’accelerazione improvvisa, compromettendo la fluidità del raccordo.
Fermo restando che nella logica Sub-D non c’è spazio per altre tipologie di curve (Rhino impone grado e tipo di curva), volevo cercare di capire cosa potrebbe succedere con una curva di Bezier o con una Nurbs, intesa questa come curva razionale.

Curva di Bezier.
Le curve di Bezier direi che non possono essere considerate nativamente Sub-D friendly perché la loro struttura dei nodi è chiusa (solo 0 e 1).
In una Bezier, l’annullamento della derivata seconda richiede che P_1 sia il punto medio tra P_0 e P_2 quindi il famoso rapporto dovrebbe essere 1/2 1/2.
Anche qui dovrebbe esserci indipendenza dal grado della curva.
Questo rapporto direi che è matematicamente incompatibile con il ritmo sequenziale delle patch Sub-D.

Curva NURBS (razionale).
Nelle NURBS, entrano in gioco i pesi w_i.
Se i pesi sono diversi da 1 (altrimenti non sarebbe razionale), la velocità parametrica viene alterata.
Per mantenere la derivata seconda nulla all’inizio, credo che bisognerebbe modificare la posizione geometrica dei punti proprio in funzione dei pesi.
Poiché le Sub-D standard utilizzano pesi unitari, l’uso di pesi non uniformi renderebbe la curva incompatibile con il sistema di suddivisione.

:clap: rinnovo i complimenti (:exploding_head: :exploding_head: )

Grande Fabio !

Grazie per l’ennesima spiegazione. :grinning:

( Prometto. Non ti chiedo altro … almeno per ora … :smile: )

Promessa di marinaio? :grinning_face:

Manco so nuotare … :blush:

Sai che alla fine è più chiaro (intuitivo) il fatto che le singole distanze d1 e d2 debbano essere d2=2*d1 piuttosto che 1/3 e 2/3…

Concordo, anche io trovo meno intuitiva la “spiegazione” Mcneel, ma oramai è così. :smiling_face_with_sunglasses:

Anch’io. :grinning_face:

Idem con patate.