none
Transformación Incorrecta de coordenadas de pantalla a coordenadas mundiales en Opentk RRS feed

  • Pregunta

  • Hola amigos del foro,

    Estoy leyendo las coordenadas de un punto generado con el evento clic del moouse en el Viewport  a través de la función UnProject de OpenGL/Opentk, las coordenadas se leen correctamente cuando está en un plano XY, sin embargo, cuando cambio a otro plano la lectura (ejemplo plano YZ) la lectura no se hace correctamente, el componente "Y" se lee un valor que debería leerse como el componente "X" del punto y el componente "X" es incorrecto. Aquí mi código.

    void VistaEnElevacionYZ()
        {
            posicion = new Vector3(5, 0, 0);
            direccion = new Vector3(0f, 0f, 0f);
            upZ = new Vector3(0, 0, 1);
            trX = -2.5f;
            trY = -2.5f;
            trZ = -1.0f;
            Escala3D = 0.35f;
        }
    void SetupCamera()
        {
            Matrix4 lookAt = Matrix4.LookAt(posicion, direccion, upZ);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            GL.LoadMatrix(ref lookAt); 
        }
    public static PointF convertScreenToWorldCoords(float x, float y)
        {
            int[] viewport = new int[4];
            Matrix4 modelViewMatrix, projectionMatrix;
            GL.GetFloat(GetPName.ModelviewMatrix, out modelViewMatrix);
            GL.GetFloat(GetPName.ProjectionMatrix, out projectionMatrix);
            GL.GetInteger(GetPName.Viewport, viewport);
            Vector2 mouse;
            mouse.X = x;
            mouse.Y = viewport[3] - y;
            Vector4 vector = UnProject(ref projectionMatrix, modelViewMatrix, new Size(viewport[2], viewport[3]), mouse);
            PointF coords = new PointF(vector.X, vector.Y);
            return coords;
        }
        
        public static Vector4 UnProject(ref Matrix4 projection, Matrix4 view, Size viewport, Vector2 mouse)
        {
            Vector4 vec;
            vec.X = 2.0f * mouse.X / (float)viewport.Width - 1;
            vec.Y = (2.0f * mouse.Y / (float)viewport.Height - 1);
            vec.Z = 0;
            vec.W = 1.0f;
    
            Matrix4 viewInv = Matrix4.Invert(view);
            Matrix4 projInv = Matrix4.Invert(projection);
            Vector4.Transform(ref vec, ref projInv, out vec);
            Vector4.Transform(ref vec, ref viewInv, out vec);
    
            if (vec.W > float.Epsilon || vec.W < float.Epsilon)
            {
                vec.X /= vec.W;
                vec.Y /= vec.W;
                vec.Z /= vec.W;
            }
            return vec;
        }
    
    
    Llamo al método convertScreenToWorldCoords () desde el evento MouseClick y al método VistaEnElevacionYZ con el evento click de un botón.

    Saludos, 

    M. Liranzo


    MLiranzo

    martes, 8 de diciembre de 2020 17:49

Respuestas

  • Acá hay algo de SFML.Net y C#

    https://www.google.com/search?q=sfml.net+tutorial&oq=sfml.net+tut&aqs=chrome.0.0i22i30j69i57.17412j0j15&sourceid=chrome&ie=UTF-8

    Si me decis que es lo que intentas hacer quizás yo te puedo ayudar más que los tutoriales para principiantes.

    • Marcado como respuesta EricRRModerator viernes, 11 de diciembre de 2020 20:34
    martes, 8 de diciembre de 2020 20:49

Todas las respuestas

  • Hola MLiranzo,

    Gracias por levantar tu consulta en los foros de MSDN. Entendimos su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    martes, 8 de diciembre de 2020 18:11
    Moderador
  • Hola Marino

    Si lo que queres hacer viene por lo grafico, sonido, input, etc, te conviene mucho más usar directamente SFML (SFML.Net es el binding para .Net), OpenGL y OpenTK se usan sólo en circunstancias muy particulares. 

    Si aún crees que necesitas usar las herramientas de bajo nivel, creo que quizás en los foros de SFML te podrían ayudar mucho mejor, SFML usa internamente OpenGL y no se ahora si también OpenTK. 

    Si lo que queres hacer es un juego o algo multimedia, te conviene más SFML, que está diseñado para ser muy fácil de usar.

    Saludos

    Pablo

    martes, 8 de diciembre de 2020 18:48
  • Saludos Pablo,

    No conozco SFML, estoy abierto a usar y aprender cualquier herramienta que me ayude a mejorar mi aplicación. Agredecería mucho si me envía algún link donde adquirir información sobre estas herramientas o algún tutorial para estudiarlo y usarlo.

    Atte. M. Liranzo


    MLiranzo

    martes, 8 de diciembre de 2020 19:38
  • Acá hay algo de SFML.Net y C#

    https://www.google.com/search?q=sfml.net+tutorial&oq=sfml.net+tut&aqs=chrome.0.0i22i30j69i57.17412j0j15&sourceid=chrome&ie=UTF-8

    Si me decis que es lo que intentas hacer quizás yo te puedo ayudar más que los tutoriales para principiantes.

    • Marcado como respuesta EricRRModerator viernes, 11 de diciembre de 2020 20:34
    martes, 8 de diciembre de 2020 20:49
  • Gracias Pablo,

    Estoy realizando una interface gráfica para una aplicación de análisis estructural, intento tener la capacidad de poder dibujar en los diferentes planos, XY (En este plano no tengo problema, ya dibujo ahí); cuando cambio la cámara al plano YZ, creo las vistas y proyecciones para iniciar el dibujo en este plano a travez del fragmento de código mostrado en mi pregunta; sin embargo se produce la situación objeto de mi pregunta.

    M. Liranzo


    MLiranzo

    martes, 8 de diciembre de 2020 21:18
  • Hola

    Si es en 3D me parece que si vas a tener que usar OpenGL. SFML no está hecho para 3D. Y tendrías que consultar la documentación técnica, lamentablemente no puedo ayudarte en esto, desconozco el tema.

    Saludos

     

    • Propuesto como respuesta EricRRModerator viernes, 11 de diciembre de 2020 20:04
    jueves, 10 de diciembre de 2020 17:35