Question

J'ai un rendu de cube dans un Viewport3D et j'ai besoin de savoir un moyen de savoir si tout le cube est visible à l'utilisateur.

Edit: Pour être clair, .. Je ne parle pas de coupure en raison de la distance d'avion près de / loin ici. Je veux dire le cube est grand ou large pour entrer dans le champ de vision des caméras.

Toute aide serait massivement apprécié!

Merci d'avance.

Était-ce utile?

La solution

Je ne peux pas offrir une solution mais je peux peut-être vous orienter dans la bonne direction.

Ce que vous devez saisir est la mesure de la projection 2D du cube sur le plan de la vue. Vous pouvez alors faire une simple vérification sur les valeurs min et max X & Y pour voir si l'ensemble du cube est visible.

Ajout d'un facteur de tolérance dans la mesure prendra soin de toute erreur d'arrondi.

EDIT: Je viens de faire une recherche Google pour "projection 2D WPF" et cette est venu. On dirait qu'il porte sur ce que vous voulez.

PLUS EDIT: Je l'ai copié la section pertinente du code à partir du lien ci-dessus ici

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

Autres conseils

Je me souviens d'un tutoriel sur le flipcode frustum culling.

Flipcode - Frustum Abattage

J'espère que ça aide.

Je peux penser à faire quelque chose de similaire à ceci:

Vérifier point le plus proche du cube lié à la caméra et vérifier si elle est clipsage du plan de coupe près. Le point le plus proche de l'appareil que je peux penser est l'un de ces points, qui composent le cube. Donc, vous devez vérifier chacun des 6 points du cube et vérifier si elles sont tronquées. Si aucun d'entre eux sont, votre cube si elle est entièrement visible Oh, et il est évident que vous devez vérifier contre le plan de délimitation beaucoup trop.

Le code est simple:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top