HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Deformare una sfera 2  (Letto 1797 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

marcomasetti

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 183
Deformare una sfera 2
« il: 30 Giugno 2012, 01:16 »
La primitive della sfera può essere scritta anche in un altro modo, sostituendo il parametro della latitudine v con il parametro dell’altezza z del parallelo rispetto il polo sud. In questo modo i paralleli risulteranno equidistanti.
Dato che nello script precedente per j=0 si aveva il polo nord e per j=m il polo sud, mentre qui è stato invertito l’ordine, per avere i parametri crescenti verso l’alto, si sono dovuti riscrivere i PGON per cambiare il senso di rotazione, altrimenti la figura verrebbe vista dall’interno, con un rendering privo di senso.
Per invertire il senso di rotazione di un PGON a tre lati si procede in questo modo:
PGON 3,0,-1,  a,b,c    diventa  PGON 3,0,-1,  -a,-c,-b
Cioè si cambia il segno degli indici degli EDGES e si scambia il secondo con il terzo.
Per un  PGON a quattro lati si procede in questo modo:
PGON 4,0,-1,  a,b,c,d    diventa  PGON 3,0,-1,  -a,-d,-c,-b
Cioè si cambia il segno degli indici degli EDGES e si scambia il secondo con il quarto.
Il nuovo script è:

base
Vert xc,yc,zc-r   !polo S
for j=1 to m-1
for i=0 to 2*m-1
z=2*r/m*j-r    !j=0 polo S: z=-r; j=m, polo N: z=r
u=180/m*i
y=r*cos(asn(z/2))  !equivalente a y=sqr(r^2-z^2)
Vert xc+ cos(u)*y ,yc+sin(u)*y, zc+z
next i
next j
Vert xc,yc,zc+r   !polo N

for j=0 to m-2
for i=1 to 2*m-1
EDGE 1+2*m*j+i,1+2*m*j+i+1, -1, -1,j1+j2*2
next i
EDGE 1+2*m*j+2*m,1+2*m*j+1, -1, -1,j1+j2*2 
next j
for j=0 to m-3
for i=1 to 2*m
EDGE 1+i+2*m*j,1+2*m+i+2*m*j, -1, -1,j1+j2*2
next i
next j
for i=1 to 2*m
EDGE 1+i,1, -1, -1,j1+j2*2
next i
for i=1 to 2*m
EDGE 1+2*m*(m-2)+i,2*m*(m-1)+2, -1, -1,j1+j2*2
next i

for i=1 to 2*m-1
PGON 3, 0, -1, -i,2*m*(2*m-3)+i,-(2*m*(2*m-3)+1+i) !calotta sud
next i
PGON 3, 0, -1, -2*m,2*m*(2*m-3)+2*m,-(2*m*(2*m-3)+1) !chiusura calotta sud

for i=1 to 2*m-1
PGON 3, 0, -1, 2*m*(m-2)+i,2*m*(2*m-2)+1+i,-(2*m*(2*m-2)+i) !calotta nord
next i

PGON 3, 0, -1, 2*m*(m-1),2*m*(2*m-2)+1,-(2*m*(2*m-1)) !chiusura calotta nord


for j=0 to m-3  !j definisce i paralleli
for i=1 to 2*m-1  !i definisce i merdiani
PGON 4, 0, -1, i+j*2*m,2*m*(m-1)+1+i+j*2*m ,-(2*m+i+j*2*m),-(2*m*(m-1)+i+j*2*m)
next i
PGON 4, 0, -1, 2*m+j*2*m,2*m*(m-1)+1+j*2*m ,-4*m-j*2*m,-2*m^2-j*2*m
next j
body -1

Nell’oggetto sfera2.gsm di esempio la sfera è stata suddivisa a righe, per evidenziare il paralleli:
sui poli sembra esservi una punta, che scompare a definizioni alte, ciò è dovuto al fatto che mentre con il parametro latitudine gli ultimi paralleli si avvicinano, con il parametro altezza sono sempre equidistanti.

La sfera scritta in questo modo permette di utilizzare come profilo dei meridiani una qualsiasi funzione:
y=f(z)     con     f (r1)=0,  f(r2)=0
r1 e r2 sono rispettivamente le distanze del poli S e N dal centro (xc,yc,zc) della superficie chiusa,
che possono essere diverse.

Vert xc,yc,zc-r1   !polo S
for j=1 to m-1
for i=0 to 2*m-1
z=(r2+r1)/m*j-r1    !j=0 polo S: z=-r; j=m, polo N: z=r
u=180/m*i
y=f(z)
Vert xc+ cos(u)*y, yc+sin(u)*y, zc+z
next i
next j
Vert xc,yc,zc+r2   !polo N

Anche i paralleli possono poi essere deformati:
Vert xc,yc,zc-r1   !polo S
for j=1 to m-1
for i=0 to 2*m-1
z=(r2+r1)/m*j-r1    !j=0 polo S: z=-r; j=m, polo N: z=r
u=180/m*i
y=f(z,u)   !f(z,0)=f(z,360)
Vert xc+ cos(u)*y, yc+sin(u)*y, zc+z
next i
next j
Vert xc,yc,zc+r2   !polo N

Negli esempi utilizziamo come y=f(z) prima una parabola comune:
y= -a1*z^2+a2 con radici in +/-sqr(a2/a1)
poi  una parabola del quarto ordine, che presenta una concavità:
y= z^4-a1*z^2+a1*a2 –a2^2 con radici in +/-sqr(a2)

In realtà nel primo esempio abbiamo utilizzato due semiparabole:
y=a2-a3*z^2   con radici in +/-sqr(a2/a3)=+/-r2, per la parte alta
y=a2-a1*z^2   con radici in +/-sqr(a2/a3)=+/-r1, per la parte bassa.
Per evitare che si sovrappongano abbiamo moltiplicato ciascuna per la funzione:
(sgn(z-za)-sgn(z-zb))/2
che vale 1 all’interno dell’intervallo [za,zb], vale ½ sugli estremi za,zb e vale 0 al di fuori:
(a2-a3*z^2)*(sgn(z)-sgn(z-r2))/2    !intervallo [0,r2]
(a2-a1*z^2)*(sgn(z+r1)-sgn(z))/2   !intervallo [-r1,0]