Domanda

Ho un rendering cubo all'interno di un Viewport3D e ho bisogno di conoscere un modo per scoprire se tutti del cubo è visibile all'utente.

Edit: Giusto per essere chiari, .. Io non sto parlando di clipping a causa della gran lunga distanza vicina / aereo qui. Voglio dire il cubo è di alta o larga per adattarsi nel campo telecamere di vista.

Qualsiasi aiuto sarebbe massicciamente apprezzato!

Grazie in anticipo.

È stato utile?

Soluzione

Non riesco a offrire una soluzione, ma posso, forse, il punto è nella giusta direzione.

Quello che vi serve per entrare in possesso di è la misura della proiezione 2D del cubo sul piano della vista. È quindi possibile fare un semplice controllo sui valori minimi e massimi X & Y per vedere se tutto il cubo è visibile.

L'aggiunta di un fattore di tolleranza nella misura in cui si prenderà cura di eventuali errori di arrotondamento.

EDIT: ho appena fatto una ricerca su Google per "proiezione 2D WPF" e questo si avvicinò. Sembra che affronta ciò che si desidera.

ULTERIORI EDIT: Ho copiato la sezione del codice dal link qui sopra qui

.
public static Rect Get2DBoundingBox(ModelVisual3D mv3d)
{
    bool bOK;

    Matrix3D m = MathUtils.TryWorldToViewportTransform(vpv, out bOK);

    bool bFirst = true;    
    Rect r = new Rect();

    if (mv3d.Content is GeometryModel3D)
    {
        GeometryModel3D gm3d = (GeometryModel3D) mv3d.Content;

        if (gm3d.Geometry is MeshGeometry3D)
        {
            MeshGeometry3D mg3d = (MeshGeometry3D)gm3d.Geometry;

            foreach (Point3D p3d in mg3d.Positions)
            {
                Point3D pb = m.Transform(p3d);
                Point p2d = new Point(pb.X, pb.Y);
                if (bFirst)
                {
                    r = new Rect(p2d, new Size(1, 1));
                    bFirst = false;
                }
                else
                {
                    r.Union(p2d);
                }
            }
        }
    }

    return r;
}

Altri suggerimenti

Mi ricordo di un tutorial su tronco di abbattimento su flipcode.

Flipcode - Frustum Culling

Spero che aiuta.

mi viene in mente di fare qualcosa di simile a questo:

Controllare il punto del cubo relativo alla telecamera più vicina e verificare se è in fase di ritagliato dal piano di ritaglio vicino. Il punto più vicino dalla macchina fotografica mi viene in mente è uno di questi punti che compongono il cubo. Così si controlla ognuno dei 6 punti del cubo e verificare se vengono tagliati. Se nessuno di loro è, quindi il cubo se completamente visibile Oh, e, ovviamente, si controlla contro il piano di taglio lontano troppo.

Il codice è semplice:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top