tipos planos plano movimientos medio general encuadres encuadre dorsal cinematograficos camara c# .net wpf 3d directx

c# - planos - ¿Cómo saber si un cierto Point3D está dentro de los límites de la vista de la cámara?



planos de camara (1)

Eso es todo. Tengo un cierto Point3D. Yo tengo una camara. Conozco el ángulo de visión de la cámara, que es de 45 grados; Sé la posición de la cámara y el vector LookDirection. Ahora quiero saber de alguna forma si el punto será visible para la cámara o no.

Gracias por aquellos que respondieron y comentaron, pero:

  1. Este no es un problema directo para mí. Esto puede parecer algo simple, pero no encontré ningún método especial o clase auxiliar para resolver el problema. Intenté resolverlo yo solo, de una manera puramente matemática, pero la solución es inestable y funciona de manera impredecible:

    bool isPointInCameraView(Point3D P, Point3D CP, Vector3D LD, double CameraAngle) { //first calculate Distance to the plane formed by normal vector LD and point P on it var D = -LD.X*P.X-LD.Y*P.Y-LD.Z*P.Z; // -AXb-BYb-CZb //L is the distance to the plane. double L = Math.Abs( (LD.X * CP.X + LD.Y * CP.Y + LD.Z * CP.Z + D)) / Math.Sqrt(LD.X * LD.X + LD.Y * LD.Y+LD.Z * LD.Z); var BL = L * Math.Tan(CameraAngle); //length of bound part var PL = Math.Sqrt(((new Vector3D(P.X - CP.X, P.Y - CP.Y, P.Z - CP.Z)).LengthSquared - L * L)); // length of point part //test if point is out of bounds! return PL <= BL; }

  2. Lo sé sobre Helix3D y lo estoy usando. Mi Viewport y Camera son de helix framework.

Creo que será más fácil entender el problema si explico el motivo por el que necesito este tipo de prueba. Estoy construyendo una aplicación de visualización de geociencia, y necesito poder acercarme a la textura para ver detalles. El problema era que no podía usar texturas demasiado grandes, ya que ocupaban demasiada memoria y tardaban demasiado en dibujar. Decidí entonces dividir mi avión en varios subrectangles, cada uno de los cuales debería manejarse por separado. Entonces, la idea es que cuando el usuario haga zoom en cierta parte del plano, solo renderice esa parte. Funcionó bien, excepto el código que aún pintaba texturas para aquellos subrectangles que eran invisibles para la cámara. Ahora quiero optimizar esto. Intenté buscar alguna función especial que me permitiera hacerlo, pero no tuve éxito. Entonces, por ahora, la solución es solo matemática y es inestable, está funcionando mal. Es por eso que hice esta pregunta aquí.


¡Bonito cuadro!

Creo que no es tan fácil si no tienes la cámara en una Viewport3D. Tendrías que componer a través de las transformaciones de Visual3D con la transformación de la cámara.

Lo más fácil sería poner el material en un Viewport3D. Entonces su pregunta es similar a esta: Proyectando un punto 3D a una coordenada de pantalla 2D y esta: información de proyección 3D .

Tenga en cuenta que algunas de las respuestas se escribieron antes de .NET 3.5, que agregó la función auxiliar Visual3D.TransformToAncestor, que es probablemente lo que necesita. Más información sobre TransformToAncestor aquí: http://blogs.msdn.com/b/wpf3d/archive/2009/05/13/transforming-bounds.aspx .

Y si está haciendo algo con WPF 3D, necesita conocer el impresionante Helix Toolkit , que es un reemplazo de 3DTools, que contiene controles de vista y varios ayudantes, y en el que se está trabajando activamente.