none
Creación de ejes en perspectiva usando OpenTk con C# RRS feed

  • Pregunta

  • Hola Gentes del Foro,

    Estoy tratando de crear un sistema de ejes cartesianos usando la Librería OpenTk, el asunto es que por más que intento no logro que mis ejes se visualisen en Perspectiva (3D), estoy colocando en mi winform un control glControl y realizo la codificación pertinente, pero no logro conseguirlo. Anexo mi código.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using OpenTK.Graphics;
    using OpenTK.Input;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using OpenTK.Graphics.OpenGL;
    using OpenTK;
    
    namespace EjemploTrianguloBlanco
    {
        public partial class Form1 : Form
        {
            bool loaded = false;
            bool hazPerspectiva = false;
            int w;
            int h;
            float anguloejex = 0;
            float anguloejey = 0;
            float anguloejez = 0;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void glControl1_Load(object sender, EventArgs e)
            {
                loaded = true;
                GL.ClearColor(Color.LightSkyBlue);
                GL.Enable(EnableCap.DepthTest); 
                SetupViewPort();
            }
            void SetupViewPort()
            {
                w = glControl1.Width;
                h = glControl1.Height;
                GL.Viewport(0, 0, w, h);
                GL.MatrixMode(MatrixMode.Projection);
                GL.LoadIdentity();
                if (hazPerspectiva)
                {
                    var p = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, w / (float)h, 1.00f, 10.0f);
                    GL.LoadMatrix(ref p);
                }
                else
                {
                    GL.Ortho(-1, 1, -1, 1, -1, 1);
                }
                GL.MatrixMode(MatrixMode.Modelview);
            }
    
            private void glControl1_Paint(object sender, PaintEventArgs e)
            {
                GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
                RenderF();
                glControl1.SwapBuffers();
            }
            void RenderF()
            {
                float angulo;
                GL.Color3(1,1,1);
                GL.LoadIdentity();
    
                GL.Rotate(anguloejex, 1.0f, 0.0f, 0.0f);
                GL.Rotate(anguloejey, 0.0f, 1.0f, 0.0f);
                GL.Rotate(anguloejez, 0.0f, 0.0f, 1.00f);
    
                // Creacion de los ejes de coordenadas
                GL.Begin(BeginMode.Lines);
                GL.Color3(1.0f, 0, 0);
                GL.Vertex3(0f, 0f, 0f);
                GL.Vertex3(1.0f, 0f, 0f);
                GL.Color3(0.0f, 1.0f, 0);
                GL.Vertex3(0f, 0f, 0f);
                GL.Vertex3(0.0f, 1f, 0f);
                GL.Color3(0.0f, 0.0f, 1.0f);
                GL.Vertex3(0f, 0f, 0f);
                GL.Vertex3(0.0f, 0f, -1.0f);
                GL.End();
                GL.Flush();
            }
    
            private void glControl1_Resize(object sender, EventArgs e)
            {
                if (!loaded)
                {
                    return;
                }
                SetupViewPort();
                glControl1.Invalidate();
            }
    
            private void glControl1_KeyDown(object sender, KeyEventArgs e)
            {
                if (!loaded)
                {
                    return;
                }
                if(e.KeyCode == Keys.F1)
                {
                    hazPerspectiva = true;
                    SetupViewPort();
                    glControl1.Invalidate();
                }
                else if(e.KeyCode == Keys.F2)
                {
                    hazPerspectiva = false;
                    SetupViewPort();
                    glControl1.Invalidate();
                }
                else if (e.KeyCode == Keys.Down)
                {
                    anguloejex =+ 0.1f;
                    SetupViewPort();
                    glControl1.Invalidate();
                }
                else if (e.KeyCode == Keys.Up)
                {
                    anguloejex = -0.1f;
                    SetupViewPort();
                    glControl1.Invalidate();
                }
                else if (e.KeyCode == Keys.Right)
                {
                    anguloejey = 0.1f;
                    SetupViewPort();
                    glControl1.Invalidate();
                }
                else if (e.KeyCode == Keys.Left)
                {
                    anguloejey = -0.1f;
                    SetupViewPort();
                    glControl1.Invalidate();
                }
            }
        }
    }

    Muchos saludos,

    Marino L.


    MLiranzo

    jueves, 1 de octubre de 2020 4:09

Todas las respuestas

  • Hola, 

     

    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.  

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    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.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    jueves, 1 de octubre de 2020 14:13
    Moderador