Pergunta

Eu tenho uma prestação cubo dentro de uma Viewport3D e eu preciso saber uma maneira de descobrir se ALL do cubo é visível para o usuário.

Edit: Só para ficar claro, .. Eu não estou falando de recorte por causa do próximo longe a distância / avião aqui. Quero dizer o cubo é alto ou grande para caber no campo de câmeras de vista.

Qualquer ajuda seria maciçamente apreciado!

Agradecemos antecipadamente.

Foi útil?

Solução

Eu não posso oferecer uma solução, mas eu posso, talvez, que você aponte na direção certa.

O que você precisa para se apossar de é a extensão da projeção 2D do cubo sobre o plano da vista. Você pode então fazer uma verificação simples sobre os valores mínimo e máximo X e Y para ver se todo o cubo é visível.

Adicionando um fator de tolerância à medida vai cuidar de eventuais erros de arredondamento.

EDIT: acabei de fazer uma pesquisa no Google para "2D projeção WPF" e este link veio à tona. Parece que ele aborda o que você quer.

editar mais:. Copiei a seção relevante do código a partir do link acima aqui

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

Outras dicas

Lembro-me de um tutorial sobre frustum abate sobre flipcode.

Flipcode - Frustum Culling

Espero que ajude.

Eu posso pensar em fazer algo semelhante a isto:

Verifique o ponto do cubo relacionadas com a câmera mais próxima e verificar se ele está sendo cortada do plano de recorte próximo. O ponto mais próximo da câmera que eu posso pensar é um destes pontos que compõem o cubo. Então, você tem que verificar cada um dos 6 pontos do cubo e verificar se eles estão sendo cortados. Se nenhum deles é, em seguida, seu cubo se totalmente visível Oh, e, obviamente, você tem que verificar contra o plano de recorte afastado também.

O código é simples:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top