Per gli smanettoni C#, qualcuno riesce a dirmi cosa sbaglio?
Gli input sono: l’altezza del testo, il punto di posizionamento e la stringa di testo da mostrare. Vorrei scrivere il codice che me lo tiene sempre fronte vista.
private void RunScript(List<string> testo, List<Point3d> posizione, double altezza, ref object A, ref object B, ref object C)
{
// Verifica che le liste abbiano la stessa dimensione
if (testo == null || posizione == null || testo.Count != posizione.Count)
{
Rhino.RhinoApp.WriteLine("Errore: le liste 'testo' e 'posizione' devono avere la stessa lunghezza.");
return;
}
// Ottieni la vista attuale della camera
RhinoViewport vp = Rhino.RhinoDoc.ActiveDoc.Views.ActiveView.ActiveViewport;
// Ottieni la direzione della vista (normale della camera)
Vector3d normaleVista = vp.CameraDirection;
normaleVista.Unitize();
List<Text3d> testo3D = new List<Text3d>();
Plane pianoTesto = new Plane();
// Itera sui punti sorgente e Crea l'entità di testo 3D
for (int i = 0; i < posizione.Count; i++)
{
pianoTesto = Plane(posizione[i], normaleVista);
// Ruota il piano per allinearlo alla vista
//pianoTesto.Rotate(Math.PI, pianoTesto.ZAxis);
// Crea l'entità di testo 3D
Text3d entitaTesto = new Text3d(testo[i], pianoTesto, altezza);
testo3D.Add(entitaTesto);
}
// Output del testo 3D
A = testo3D;
}
Su Rhino esistono i “punti di annotazione” (o Annotate dot in inglese) che mantengono una proporzione costante sullo schermo, invece che rispettare la prospettiva (lontano=piccolo) della vista 3d.
Se tu usi dei testi 3d, c’è l’opzione “Horizontal to view” ma non mi pare ce ne sia una relativa alla dimensione.
Dovresti aggiungere una funziona che scala tutti i tuoi testi in funzione della distanza dalla telecamera, e assegnarla all’evento camera, così che triggheri ogni volta che la camera si muove…
intendevi questo?
I text dot o i testi generati dal text tag di grasshopper secondo me seguono una diversa “pipeline”, credo siano testi letteralmente 2D, disegnati sullo spazio dello schermo (in pixel), piuttosto che nello spazio 3d, infatti non possono essere “oscurati/eclissati” da niente, sono disegnati per ultimi, sullo schermo.
Se vuoi farteli te per conto tui devi comunque gestire l’evento camera per correggere costantemente la posizione su schermo, mentre se usi i text dot, trovi tutto già pronto.
Quale delle due strade pensi sia meglio?
Edit:
con i text dot puoi fare molto, e ti semplifichi parecchio la vita:
Una scala in base alla distanza è già molto evoluto, mi accontento di cambiare io la dimensione del testo con uno slider. Nel forum inglese ho trovato questo. 20_07_29_text_oriented_to_camera.gh (20,9 KB)
Utile per un lavoro simile, ma non capisco perché mi crea questa situazione:
Ho capito che con il comando trigger associato al componente che mi restituisce la vista posso aggiornare il piano di riferimento del testo. A questo punto vi chiedo solo come creare questo componente, il resto dovrei riuscire a farlo io.