Rotazione vettore

Emilio quando ti ho risposto non avevo notato che avevo commesso un errore nella soluzione
mancava “VectorRotate” che ho corretto quindi la sequenza giusta è questa :

VectorAdd “VectorRotate” VectorScale VectorUnitize VectorCreate

tra l’altro mi manca un passaggio
se uso il comando :
Rhino.OffsetCurve strObject, Array(0,0,0), 1.0
se al posto del Array gli inserisco Rhino.GetPoint “Offset” viene eseguito nella direzione del punto

ora vorrei ottenere lo stesso risultato tramite “VectorRotate” che usa sia Array che Angle
nel senso che se angolo è positivo la rotazione va in un verso se negativo va nell’altro

  1. avevo pensato di usare “VectorCompare” per ottenere 1 pos o neg e moltiplicarlo con angolo
    ma o non riesco a trovare la combinazione giusta da comparare oppure è tutto sbagliato
  2. ho provato anche come x OffsetCurve inserendo GetPoint al posto di Array ma questa volta non va

qualche idea in merito?

Se questa e’ l’operazione da effettuare, posta lo script e ne discutiamo

ciao Emilio

come già detto basta annidare i vari vector nell’ordine che ho postato nulla di complicato

Call Rhino.MoveObject(O, A, Rhino.VectorAdd(A, Rhino.VectorRotate(Rhino.VectorScale(Rhino.VectorUnitize(Rhino.VectorCreate(A, B)), 5), 90.0, Array(0, 0, 1))))

ora come dicevo se riuscirei a capire meglio il funzionamento di quanto segue mi farebbe piacere:

tornando al problema di dove dovrebbe essere effettuato lo spostamento questo lo dovrei aggiungere

sopra ho elencato quello che ho fatto credo che la strada sia quella ma ci sto girando in torno :rage:

OK, questo sposta l’oggetto come dicevi.

VectorCreate calcola semplicemente A - B, cioe’ sottrae B da A.
( E’ uguale a VectorSubtract )

la freccia “A - B” indica il vettore costruito da VectorCreate.
Applicandoci VectorUnitize, il risultato risulta rimpicciolito in modo da essere lungo 1.

Per avere qualcosa da vedere e misurare, i vettori in questione sono “applicati” in un certo punto.
Tieni conto che un vettore non ha un punto di applicazione prestabilito.
Lo possiamo “spostare” dove vogliamo.
Un vettore indica semplicemente uno “spostamento” di una certa lunghezza lungo una certa direzione.

Cos’e’ che manca ?
L’istruzione che hai postato non serve a spostare l’oggetto ?

EDIT
( E’ uguale a VectorSubtract )
Questo non e’ esatto.
VectorCreate vuole 2 punti
VectorSubtract vuole 2 vettori
… Anche se il calcolo sulle componenti e’ lo stesso …


prendo in prestito la tua foto :slight_smile:
l’oggetto come abbiamo visto si sposta di 90°
ma vorrei indicare io in quale direzione
posto un esempio:

  1. Rhino.OffsetCurve Rhino.GetObject, Array(0, 0, 0), 1.0
  2. Rhino.OffsetCurve Rhino.GetObject, Rhino.GetPoint, 1.0

nel primo esempio come da guida esegue Offset a volte ad un lato a volte da un’altro
mentre nel secondo caso viene eseguito Offset nel lato dove viene inserito il punto

vorrei fare la stessa cosa con VectorRotate che richiede Array(0, 0, 1) come potrei fare?
un’alternativa sarebbe poter cambiare angolo da pos in neg usando GetPoint come fare?

Se vuoi invertire la rotazione, scrivi -90 invece di 90
Oppure Array(0,0,-1) invece di Array(0,0,1)

è proprio questo risultato che vorrei ottenere ma essendo che è variabile l’intenzione in entrambe le soluzioni lo vorrei ottenere usando GetPoint avevo provato con VectorCompare che restituisce 1 o -1 , e lo moltiplicavo o con l’angolo o con array ma non riesco ad individuare i valori giusti da comparare per il corretto risultato :thinking:

Se lavori sul piano (cioe’ sempre con Z costante), potresti provare cosi’:
Dati i punti A e B e il punto cliccato P

ab = rs.VectorCreate( B, A )
ap = rs.VectorCreate( P, A )
asse = rs.VectorCrossProduct( ab, ap )

su “asse” dovresti ottenere l’asse di rotazione.

Non ho provato, se vuoi vedi tu se funziona … :slight_smile:

Il cross product (prodotto vettoriale o prodotto esterno in italiano) e’ quello che segue la regola della mano destra.
Chiudi la mano destra, poi estendi pollice, indice e medio in modo che formino tra di loro angoli di circa 90 gradi.

CrossProduct( pollice, indice ) ti da’ la direzione del medio.

(Per i sistemi di riferimento destrorsi, come quello dei piani di Rhino, abbiamo

CrossProduct( asseX, asseY ) => asseZ
CrossProduct( asseY, asseZ ) => asseX
CrossProduct( asseZ, asseX ) => asseY

Se inverti i due operandi ottieni il vettore opposto

Se gli operandi sono paralleli ottieni il vettore nullo )

Per la lunghezza del vettore ottenuto dal prodotto esterno c’entra l’angolo tra i due vettori utilizzati, ma a noi qui dovrebbe servire solo la direzione.

bellissima spiegazione grazie Emilio

unica cosa potresti fare un esempio pratico con quanto ho postato io in precedenza

Hai fatto la prova che ti ho detto ?

Fuziona ?

Se funziona e’ questo l’esempio pratico.
Se no, dimmi cosa succede.

ho fatto un print con Pt2Str del VectorCrossProduct mi ritorna come valori (0,0,variabile)

come dovrei gestire questo risultato?

la coordinata z come anche hai sottolineato prima non dovrebbe essere solo 1 o -1?

Cioe’ lo usi nello script al posto di Array( 0, 0, 1 ) per ruotare l’oggetto.

… Credevo di aver detto tutto il contrario … :confused::smile:

Volevo dire di non preoccuparsi della lunghezza, per l’asse di rotazione va bene qualunque valore.
Se pero’ preferisci avere una lunghezza unitaria, allora usa VectorUnitize e lui ti da’ il tuo bel vettore con lunghezza 1. :slight_smile:

OK Emilo, adesso sembra che funziona finisco di fare altre prove :slight_smile:

complimenti ancora per la spiegazione di prima (ma il fatto che quando si ruota inserendo un numero positivo gira in senso “antiorario” deriva dal movimento che fa il pollice quindi ?)

Anche questa e’ una convenzione.
Volendo possiamo usare un’altra regole della mano destra.
Fai il pugno destro ma alza il pollice, tipo segno di OK.
Tenendo fermo il pollice, apri e chiudi il pugno.
Quando lo chiudi, le dita girano con un angolo positivo, se consideri il pollice come asse di rotazione.

(Anche qui, come per il prodotto esterno, consideriamo che i vari vettori rappresentati dalle dita abbiano la direzione verso l’unghia )

Se controlli, vedi che e’ proprio il verso che utilizza VectorRotate e che utilizza Rhino in generale.

ahahahah grande :smile: :smile:
per la serie niente è a caso quando si parla di matematica geometria algebra etc

giusto per completezza ma VectorUnitize che tipo di calcolo fa su VectorCreate?

aspe aspe ora ti faccio fare due risate
io inserisco spesso questo emoji :+1:

ma vuoi vedere che è stato sdoganato per caso da qualche matematico
come affermazione positiva tenendo presente quanto hai detto prima?

VectorCreate costruisce un vettore dati 2 punti

VectorUnitize costruisce un vettore dato un altro vettore (cambia solo la lunghezza)
( OK, se il vettore ha gia’ lunghezza = 1, non cambia niente )

Lo vedi il vettore piccolino lungo 1 ottenuto da VectorUnitize sul vettore VectorCreate( A, B ) ?

E’ indicato dalla freccia piu’ in basso.

in pratica per adesso so solo che nella rotazione come da esempi postati serve Rhino.VectorUnitize

preso dalla guida : Rhino.VectorUnitize(Array(1.5, -4.1, 3.6)) ritorna (0.265,-0.725,0.636)

che tipo di calcolo esegue?

nel tuo schema invece, non comprendo “1.00” che viene indicato nella foto

(ovviamente Emilio per quanto sia possibile una spiegazione se vuoi)

Quei tre numeri 0.265,-0.725,0.636 sono le componenti del vettore unitario (cioè di lunghezza 1) e se sommi i quadrati delle tre componenti otterrai 1 anche senza fare la radice quadrata perchè la radice di 1 è=1. Ai miei tempi questa era la geometria delle scuole Medie.

grazie Emilio e grazie Vittorio per l’ultima spiegazione

diciamo che per quanto possibile, il discorso mi è un pochino più chiaro concettualmente :+1: