Nautilus predstavlja živi primer prirodnog rasta koji se može precizno modelovati matematičkim strukturama. Njegova ljuštura se razvija u nizu komora koje rastu progresivno, zadržavajući konstantan oblik preseka, ali uz proporcionalno povećanje dimenzija. Ovaj rast je približno logaritamski i može se modelovati spiralom čiji se radijus povećava eksponencijalno u odnosu na ugaoni pomak.
Posebnost geometrije nautilusa leži u njegovoj sposobnosti da kombinuje stabilnost i rast, funkcionalnost i formu. Eliptični presek trube školjke omogućava hidrodinamičku efikasnost, dok progresivno povećanje dimenzija reflektuje prirodni rast organizma koji ne narušava integritet cele strukture. Ovakva arhitektura omogućava organizmu da se širi bez rekonstrukcije prethodnih delova.
Matematički model koji reprodukuje ovu geometriju koristi parametrizovanu prostornu spiralu definisanu u trodimenzionalnom prostoru, uz dodatne funkcije koje opisuju promene dimenzija eliptičnog preseka duž dužine spirale. Početne i krajnje vrednosti dimenzija preseka (duža i kraća osa elipse) određuju ukupni odnos forme, koji se u ovom slučaju oslanja na proporcije prepoznatljive u prirodi, uključujući odnos koji približava zlatni presek.
Ovakav model nije samo vizuelna rekonstrukcija već funkcionalna aproksimacija realnog biološkog sistema. Njegova primena se ne ograničava na biološku ilustraciju – koristi se i u arhitekturi, dizajnu, analizi rasta i algoritamskoj estetici. Osnova leži u principima koji kombinuju prirodnu efikasnost sa matematičkom elegancijom.
Matematički model nautilus školjke
Nautilus školjka je fascinantan primer prirodnog oblika koji se može matematički modelovati koristeći logaritamsku spiralu i promenljive eliptične preseke duž konusne površine. Ovaj model se zasniva na principima zlatnog preseka, zlatnog ugla i Fibonaccijevog niza.
1. Logaritamska spirala
Osnovna spirala u ovom modelu data je parametrizacijom: \[ r(\theta) = r_0 e^{k \theta} \] gde je:
- \( r_0 \) – početni radijus spirale
- \( \theta \) – ugao u radijanima
- \( k = \frac{\ln \varphi}{\pi/2} \approx 0.3063489 \), gde je \( \varphi = \frac{1 + \sqrt{5}}{2} \) zlatni presek
2. Konusni rast duž ose Z
Visina spirale raste linearno sa uglom: \[ z(\theta) = c \cdot \theta \] gde je \( c \) konstanta koja kontroliše vertikalni rast spirale.
3. Eliptični preseci duž spirale
Poprečni presek školjke duž spirale je elipsa sa poluosama koje rastu eksponencijalno: \[ a(\theta) = a_0 \cdot e^{s \theta} \] \[ b(\theta) = b_0 \cdot e^{t \theta} \] gde su:
- \( a_0 \) – početna velika poluosa elipse (širina)
- \( b_0 \) – početna mala poluosa elipse (visina)
- \( s \) i \( t \) – faktori rasta određeni tako da: \[ a(\theta_{\text{max}}) = a_{\text{end}}, \quad b(\theta_{\text{max}}) = b_{\text{end}} \] odnosno: \[ s = \frac{1}{\theta_{\text{max}}} \ln\left( \frac{a_{\text{end}}}{a_0} \right), \quad t = \frac{1}{\theta_{\text{max}}} \ln\left( \frac{b_{\text{end}}}{b_0} \right) \]
4. Parametri korišćeni u modelu
- \( r_0 = 1 \)
- \( k = \frac{\ln \varphi}{\pi/2} \approx 0.306 \)
- \( c = 0.2 \) – vertikalni nagib spirale
- \( a_0 = 0.2 \), \( b_0 = 0.1 \) – početne dimenzije elipse
- \( a_{\text{end}} = 100 \), \( b_{\text{end}} = 62 \) – krajnje dimenzije preseka
- \( \theta_{\text{max}} = 8\pi \) – ukupni ugao (4 puna obrtaja)
5. Veza sa prirodnim principima
Ovaj model povezuje nekoliko osnovnih principa iz prirode:
- Zlatni presek (\( \varphi \approx 1.618 \)) upravlja eksponencijalnim širenjem spirale
- Zlatni ugao (\( \approx 137.5^\circ \)) je povezan sa optimalnim rasporedom elemenata u prirodi
- Fibonaccijev niz definiše odnose dimenzija i formu

Programski kod za nautilus10.py
import numpy as np import trimesh # ========================== # PARAMETRI ŠKOLJKE (ulazne vrednosti) # ========================== r0 = 1.0 # početni radijus spirale (udaljenost centra spirale od koordinatnog početka) # Zlatni presek i zlatni ugao phi = (1 + np.sqrt(5)) / 2 # zlatni presek ≈ 1.618 alpha = 2 * np.pi * (1 - 1 / phi) # zlatni ugao ≈ 2.39996 rad (~137.5°) k = np.log(phi) / alpha # parametar k koji osigurava rast radijusa po zlatnom preseku c = 0.15 # vertikalni rast spirale (nagib duž Z ose), manji da ne deformiše školjku previše # POČETNE dimenzije elipsa (poluose preseka tube na početku spirale) a0_start = 0.4 # velika poluosa elipse na startu (širina preseka) b0_start = 0.2 # mala poluosa elipse na startu (visina preseka) # KRAJNJE dimenzije elipsa (poluose preseka tube na kraju spirale) a0_end = 100 # velika poluosa elipse na kraju (širina preseka raste do ove vrednosti) b0_end = 62 # mala poluosa elipse na kraju (visina preseka raste do ove vrednosti) n_turns = 4 # broj obrtaja spirale n_points = 300 # broj uzoraka duž spirale (glatkoća modela) n_ellipse = 20 # broj tačaka po elipsi (glatkoća preseka) output_file = "nautilus_shell.obj" # izlazni .obj fajl # ========================== # PRIPREMA SPIRALE # ========================== theta_vals = np.linspace(0, 2 * np.pi * n_turns, n_points) # vrednosti ugla theta od 0 do maksimalnog theta_max = 2 * np.pi * n_turns # maksimalni ugao - za interpolaciju preseka sections = [] for theta in theta_vals: # Pozicija centra spirale r = r0 * np.exp(k * theta) x = r * np.cos(theta) y = r * np.sin(theta) z = c * theta # Veličina preseka (elipse) - linearna interpolacija poluosa između starta i kraja a = a0_start + (a0_end - a0_start) * (theta / theta_max) b = b0_start + (b0_end - b0_start) * (theta / theta_max) # Tangenta spirale (pravac kretanja) dx_dtheta = r * (-np.sin(theta)) + k * r * np.cos(theta) dy_dtheta = r * (np.cos(theta)) + k * r * np.sin(theta) dz_dtheta = c tangent = np.array([dx_dtheta, dy_dtheta, dz_dtheta]) tangent /= np.linalg.norm(tangent) # Normalni vektor (prava normalna na tangent) up = np.array([0, 0, 1]) normal = np.cross(tangent, up) if np.linalg.norm(normal) < 1e-6: normal = np.array([1, 0, 0]) normal /= np.linalg.norm(normal) binormal = np.cross(tangent, normal) # Generisanje tačaka elipse u lokalnoj ravni phi_vals = np.linspace(0, 2 * np.pi, n_ellipse, endpoint=False) ellipse_points = [] for phi in phi_vals: px = a * np.cos(phi) py = b * np.sin(phi) point = np.array([x, y, z]) + px * normal + py * binormal ellipse_points.append(point) sections.append(np.array(ellipse_points)) # ========================== # POVEZIVANJE TAČAKA U MREŽU (faces & vertices) # ========================== faces = [] vertices = [] for i in range(len(sections) - 1): p0 = sections[i] p1 = sections[i + 1] idx_offset = len(vertices) vertices.extend(p0) vertices.extend(p1) for j in range(n_ellipse): v0 = idx_offset + j v1 = idx_offset + (j + 1) % n_ellipse v2 = idx_offset + n_ellipse + (j + 1) % n_ellipse v3 = idx_offset + n_ellipse + j # Dve trouglaste strane na kvadratu između elipsi faces.append([v0, v1, v2]) faces.append([v0, v2, v3]) # ========================== # EKSPORT MODELA # ========================== vertices = np.array(vertices) faces = np.array(faces) mesh = trimesh.Trimesh(vertices=vertices, faces=faces) mesh.export(output_file) print(f"✅ 3D model '{output_file}' je uspešno generisan.")