Pregunta

Tengo una representación dentro de un cubo de Viewport3D y necesito saber una manera de averiguar si todos los del cubo es visible para el usuario.

Editar: Para que quede claro, .. No estoy hablando de saturación debido a la distancia de avión cerca / lejos aquí. Me refiero al cubo es de alto o ancho excesivo para las cámaras en el campo de visión.

Cualquier ayuda sería enormemente apreciada!

Gracias de antemano.

¿Fue útil?

Solución

No puedo ofrecer una solución pero no puedo, tal vez, que apuntan en la dirección correcta.

Lo que hay que conseguir es la medida de la proyección 2D del cubo en el plano de la vista. A continuación, puede hacer una simple comprobación de los valores mínimo y máximo de X e Y para ver si el conjunto del cubo es visible.

Adición de un factor de tolerancia de la medida se hará cargo de los errores de redondeo.

EDIT: Acabo de hacer una búsqueda en Google de "proyección 2D WPF" y esta ocurrió. Parece que se ocupa de lo que desea.

Más EDIT: He copiado la sección correspondiente del código desde el enlace anterior aquí

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

Otros consejos

Recuerdo un tutorial sobre tronco de sacrificio en Flipcode.

Flipcode - Frustum Culling

espero que ayude.

No puedo pensar en hacer algo similar a esto:

Comprobar el punto del cubo en relación con la cámara más cercana y comprobar si está siendo recortado desde el plano de delimitación cercano. El punto de la cámara se me ocurre más cercano es uno de estos puntos que componen el cubo. Así que hay que comprobar cada uno de los 6 puntos del cubo y comprobar si están siendo recortados. Si ninguno de ellos es, entonces su cubo si totalmente visible Oh, y, obviamente, usted tiene que comprobar contra el plano de delimitación lejano también.

El código es simple:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top