Quindi è tutto. Ho un certo Point3D. Ho una macchina fotografica Conosco l'angolo di visuale della fotocamera, che è 45 gradi; Conosco la posizione della telecamera e il vettore di LookDirection. Ora voglio un modo per scoprire se il punto sarà visibile o meno dalla fotocamera.Come scoprire se un determinato Point3D si trova all'interno dei limiti della vista della telecamera?
Grazie per coloro che hanno risposto e commentato, ma:
Questo non è un problema semplice per me. Potrebbe sembrare una cosa semplice, ma non ho trovato alcun metodo speciale o classe di supporto per risolvere il problema. Ho cercato di risolvere io stesso, in modo puramente matematico, ma la soluzione è instabile e lavora imprevedibile:
bool isPointInCameraView(Point3D P, Point3D CP, Vector3D LD, double CameraAngle) { //first calculate Distance to the plane formed by normal vector LD and point P on it var D = -LD.X*P.X-LD.Y*P.Y-LD.Z*P.Z; // -AXb-BYb-CZb //L is the distance to the plane. double L = Math.Abs((LD.X * CP.X + LD.Y * CP.Y + LD.Z * CP.Z + D))/Math.Sqrt(LD.X * LD.X + LD.Y * LD.Y+LD.Z * LD.Z); var BL = L * Math.Tan(CameraAngle); //length of bound part var PL = Math.Sqrt(((new Vector3D(P.X - CP.X, P.Y - CP.Y, P.Z - CP.Z)).LengthSquared - L * L)); // length of point part //test if point is out of bounds! return PL <= BL; }
so circa Helix3D e sto usando. My Viewport e Camera sono del framework helix.
Penso che sarà più facile capire il problema se spiego il motivo per cui ho bisogno di questo tipo di test. Sto costruendo un'applicazione di visualizzazione geoscience e ho bisogno di essere in grado di ingrandire in profondità la texture per vedere i dettagli. Il problema era che non potevo usare trame troppo grandi, dato che occuperebbero troppa memoria e impiegare troppo tempo per disegnare. Decisi allora di dividere il mio aereo in diversi sottorivoli, ognuno dei quali dovrebbe essere gestito separatamente. Quindi l'idea è che quando l'utente zooma in certe parti del piano, renderei solo quella parte. Ha funzionato bene, tranne che il codice ha ancora riverniciato le trame per quei sottorallacciamenti che erano invisibili alla fotocamera. Ora voglio ottimizzare questo. Ho provato a cercare qualsiasi funzione speciale che mi permettesse di farlo, ma senza successo. Quindi per ora la soluzione è solo matematica ed è instabile, funziona male. Ecco perché ho fatto questa domanda qui.
questo è probabilmente più rilevante sul http://math.stackexchange.com/ –
Cosa avete provato già? Questo è un problema piuttosto semplice, sarebbe bello vedere che avresti fatto qualche sforzo in ... –