2012-05-14 10 views
6

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?

So p1 Should be visible, p2 should not Grazie per coloro che hanno risposto e commentato, ma:

  1. 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; 
    } 
    
  2. 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.

+0

questo è probabilmente più rilevante sul http://math.stackexchange.com/ –

+0

Cosa avete provato già? Questo è un problema piuttosto semplice, sarebbe bello vedere che avresti fatto qualche sforzo in ... –

risposta

1

Nice picture!

penso che non è così facile se non si ha la fotocamera in un Viewport3D. Dovresti comporre le trasformazioni di Visual3D con la trasformazione Camera.

più semplice sarebbe quella di mettere la roba in un Viewport3D. Quindi la tua domanda è simile a questa: Projecting a 3D point to a 2D screen coordinate e questa: 3D Projection information.

Si noti che alcune delle risposte sono state scritte prima di .NET 3.5, che ha aggiunto la funzione di supporto Visual3D.TransformToAncestor, che è probabilmente ciò di cui si ha bisogno. Ulteriori informazioni su TransformToAncestor qui: http://blogs.msdn.com/b/wpf3d/archive/2009/05/13/transforming-bounds.aspx.

E se si sta facendo qualcosa con WPF 3D, è necessario conoscere il fantastico Helix Toolkit, che è un sostituto di 3DTools, contenente i controlli di visualizzazione e vari aiutanti, ed è attivamente in lavorazione.

Problemi correlati