HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Cilindro obliquo 1  (Letto 1751 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
Cilindro obliquo 1
« il: 29 Settembre 2012, 16:14 »
Riuscire a costruire primitive personali permette di allargare le possibilità di variazione delle forme.
Inoltre una primitiva personale può fare a meno dei comandi di spostamento, che possono essere inseriti direttamente nello script dei vertici.
Propongo un esempio molto semplice.
Il cilindro preconfezionato
cylind h,r
risulta appoggiato sul piano xy, con asse coincidente con z.
Per costruire combinazioni di cilindri variamente orientati nello spazio, occorre scervellarsi con i comandi di spostamento.  A meno di non utilizzare il comando XFORM, ma poi occorre ragionare secondo l’algebra vettoriale 3D.    Se invece costruiamo direttamente un cilindro con l’asse appoggiato su un vettore 1_2, basterà inserire le coordinate del punto di applicazione 1=(x1,y1,z1) e del punto finale 2=( x2,y2,z2).
Il punto finale poi potrebbe essere espresso in funzione del modulo del vettore h, dell’azimut az rispetto x e della latitudine la rispetto xy:
x2=x1+h*cos(la)*cos(az)
y2=y1+h*cos(la)*sin(az)
z2=z1+h*sin(la)
Da notare che al variare di la entro (-90,90) e di az entro (0,180) si ha l’equazione della sfera di raggio h e centro in 1.

Per costruire i vertici del cilindro con asse 1_2 e raggio r, occorre costruire due versori normali a tale vettore 1-2.
Con semplici considerazioni di geometria elementare, applicando il teorema di Pitagora, ragionando sul piano verticale per 1-2 e sulle proiezioni ortogonali lungo xy, si ricavano le formule di due possibili versori che indico con  i,  j :

dx=x2-x1
dy=y2-y1
dz=z2-z1
d1=sqr(dx^2+dy^2)
d2=sqr(dx^2+dy^2+dz^2)
i=( dz*dx/(d1*d2) , dz*dy/(d1*d2) , -d1/d2 )
j=(-dy/d1, dx/d1, 0 )

Supponendo che 1-2 segua all’incirca la direzione da O verso l’alto lungo il piano bisettore x=y, quadrante x+y+, il vettore i punta verso il basso sempre lungo il piano bisettore x=y, in direzione del quadrante x+y+.
Il vettore i appartiene al piano verticale per 1-2. Questo è il più complesso da costruire, perché occorre prima proiettarlo su xy, poi da qui va proiettato lungo gli assi coordinati x,y.
Nelle condizioni esposte, il vettore j punta invece verso il quadrante x-y+, risultando comunque sempre orizzontale ed ortogonale alla traccia su xy del piano verticale per 1-2.
La circonferenza per 1 normale a 1-2 si costruisce mediante tali versori mediante l’algebra vettoriale:
OP=O_1+i*r*cos(an)+j*r*sin(an)   (1)
con an variabile entro 0, 360.
Di fatto i e j sostituiscono i versori degli assi x,y. In effetti tale formula (1) esprime una circonferenza parallela al piano x,y con centro 1 e raggio r.
Passando dalla geometria vettoriale alla geometria cartesiana, con OP=(x,y,z), la formula (1) si traduce in:

x=x1+dz*dx/(d1*d2)*r*cos(an)-dy/d1*r*sin(an),
 y=y1+dz*dy/(d1*d2)*r*cos(an)+dx/d1*r*sin(an),
 z=  z1-d1/d2*r*cos(an)

Ragionando nello stesso modo anche per il punto 2, si ottiene infine lo script dei vertici, cui aggiungiamo anche la parte EDGE e PGON:
x1=
y1=
z1=
x2=
y2=
z2=
nc=   !divisioni crf.
r=     !raggio cil.
j1=   !bit nascondi spigoli
j2=   !bit sup. soft

dx=x2-x1
dy=y2-y1
dz=z2-z1
d1=sqr(dx^2+dy^2)
d2=sqr(dx^2+dy^2+dz^2)
BASE
for i=0 to nc-1
an=360/nc*i
x=x1+dz*dx/(d1*d2)*r*cos(an)-dy/d1*r*sin(an),
y=y1+dz*dy/(d1*d2)*r*cos(an)+dx/d1*r*sin(an),
z=z1-d1/d2*r*cos(an)
VERT x, y, z
next i
for i=0 to nc-1
an=360/nc*i
x=x2+dz*dx/(d1*d2)*r*cos(an)-dy/d1*r*sin(an),
y=y2+dz*dy/(d1*d2)*r*cos(an)+dx/d1*r*sin(an),
z=z2-d1/d2*r*cos(an)
VERT x, y, z
next i

for i=1 to nc-1
EDGE i,i+1,-1,-1,j1
next i
EDGE i,1,-1,-1,j1

for i=nc+1 to 2*nc-1
EDGE i,i+1,-1,-1,j1
next i
EDGE i,nc+1,-1,-1,j1

for i=1 to nc
EDGE i,i+nc,-1,-1,j1+2*j2
next i

for i=1 to nc-1
PGON 4,0,-1,i,i+2*nc+1,-(i+nc),-(i+2*nc)
next i
PGON 4,0,-1,i,2*nc+1,-(i+nc),-(i+2*nc)

for i=0 to nc-1
PUT -(nc-i)
next i
PGON nc,0,-1,GET (nsp)

for i=1 to nc
PUT nc+i
next i
PGON nc,0,-1,GET (nsp)

BODY -1

Nota: la primitiva non permette di utilizzare assi verticali per il cilindro.

Questa primitiva presenta diversi vantaggi: intanto è possibile eliminare le basi, rappresentate dai due ultimi poligoni di nc lati (l’ultimo è quello su 2), oppure si possono applicare materiali diversi a basi e superficie laterali. Questa poi può essere resa soft con j2=1, ovvero si possono nascondere gli spigoli.
Infine si possono usare raggi diversi su 1 e 2, ricavando tronchi di piramide al posto del prisma di nc lati.
Ancora aggiungendo edges obliqui le basi potrebbero essere rese non parallele.

Qui presento un oggetto con la primitiva cilindrica semplice,in varie versioni (aprire il commento).
Una sua applicazione ad una forma ramificata.
Una applicazione della forma preconfezionata CYLIND h, r  ad un albero frattale.

Nel post successivo Cilindro obliquo 2 si trova la generalizzazione del cilindro semplice con pgon triangolare.   Poi si presenta la forma ramificata con tronchi di cono al posto del cilindro e lo stesso albero frattale, che risultano più elegante per l’uso di tronchi di cono.