WPF 3D - Detirmine se un ModelVisual3D viene ritagliato all'interno è Viewport3D
-
22-08-2019 - |
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.
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.
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