Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2013, 13:41   #1
Truepak
 
Регистрация: 05.12.2012
Сообщений: 3
По умолчанию Проблема с OpenGL(OpenTK)

Делаю лабораторную работу по компьютерной графики возник один вопрос. Нужно нарисовать треугольник по координатам, а потом повернуть его на определенный угол вокруг оси oz и oy. Вокруг oz поворачивает нормально, а по оу нажимаешь кнопку и пропадает изображение...

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenTK.Graphics.OpenGL;

namespace WindowsFormsApplication16
{
    public partial class Form1 : Form
    {
        float AngleY = 0;
        float AngleZ = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {            
            GL.ClearColor(Color.White);
            SetupViewport();
        }
        private void SetupViewport()
        {
            int w = glControl1.Width;
            int h = glControl1.Height;
            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadIdentity();
            GL.Ortho(0, w, 0, h, -1, 1); 
            GL.Viewport(0, 0, w, h);
        }

        private void glControl1_Resize(object sender, EventArgs e)
        {           
            SetupViewport();
            glControl1.Invalidate();
        }

        private void glControl1_Paint(object sender, PaintEventArgs e)
        {            
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            GL.Rotate(AngleY, 0.0,1.0, 0.0);
            GL.Rotate(AngleZ, 0.0, 0.0, 1.0);

            
            GL.Color3(1f, 0f, 0f);
            GL.Begin(BeginMode.Triangles);
            double x1, x2, x3, y1, y2, y3;
            x1 = Convert.ToDouble(tx1.Text);
            x2 = Convert.ToDouble(tx2.Text);
            x3 = Convert.ToDouble(tx3.Text);
            y1 = Convert.ToDouble(ty1.Text);
            y2 = Convert.ToDouble(ty2.Text);
            y3 = Convert.ToDouble(ty3.Text);
            
            GL.Vertex3(100, 50, 0);
            GL.Vertex3(200, 100, 0);
            GL.Vertex3(200, 200, 0);
            
            GL.End();
            //GL.Flush();
            //GL.Finish();
            glControl1.SwapBuffers();
          
        }

        private void button1_Click(object sender, EventArgs e)
        {
            AngleY = (float)Convert.ToDouble(tbalpha.Text);
            glControl1.Invalidate();

           
        }

        private void button2_Click(object sender, EventArgs e)
        {
            AngleZ = (float)Convert.ToDouble(tbbetta.Text);
            glControl1.Invalidate();

           
        }
    }
}
Truepak вне форума Ответить с цитированием
Старый 15.01.2013, 12:07   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Вообще код немного странный: у вас выставлена ортогональная проекция, но поворачиваете вы по двум осям. Просто в 2D пространстве поворачивать имеет смысл только вокруг OZ. Какое у вас задание было? В данный момент вокруг OY тоже поворачивается, задайте угол где-нибудь 0,4 и станет заметно. Но когда поворачиваете больше, происходит отсечение, и это правильно. Думаю, вам нужно было воспользоваться GL.Frustrum.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 15.01.2013, 12:22   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Думаю, вам надо было что-то вроде этого:
Код:
    public partial class Form1 : Form
    {
        float AngleY = 0;
        float AngleZ = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            GL.ClearColor(Color.White);
            SetupViewport();
        }
        private void SetupViewport()
        {
            int w = glControl1.Width;
            int h = glControl1.Height;
            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadIdentity();
            //GL.Ortho(0, w, 0, h, -1, 1);
            var m = Matrix4.CreatePerspectiveFieldOfView(3.1415f / 4, w / (float)h, 1, 1500);
            GL.LoadMatrix(ref m);
            GL.Viewport(0, 0, w, h);
        }

        private void glControl1_Resize(object sender, EventArgs e)
        {
            SetupViewport();
            glControl1.Invalidate();
        }

        private void glControl1_Paint(object sender, PaintEventArgs e)
        {
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            var m = Matrix4.LookAt(180, 130, 130, 0, 0, 0, 0, 1, 0);
            GL.LoadMatrix(ref m);

            GL.Rotate(AngleY, 0.0, 1.0, 0.0);
            GL.Rotate(AngleZ, 0.0, 0.0, 1.0);

            GL.Color3(1f, 0f, 0f);
            GL.Begin(BeginMode.Lines);
            GL.Vertex3(0, 0, 0);
            GL.Vertex3(100, 0, 0);
            GL.End();

            GL.Color3(0f, 1f, 0f);
            GL.Begin(BeginMode.Lines);
            GL.Vertex3(0, 0, 0);
            GL.Vertex3(0, 100, 0);
            GL.End();

            GL.Color3(0f, 0f, 1f);
            GL.Begin(BeginMode.Lines);
            GL.Vertex3(0, 0, 0);
            GL.Vertex3(0, 0, 100);
            GL.End();


            GL.Color3(1f, 0f, 0f);
            GL.Begin(BeginMode.Triangles);
            /*double x1, x2, x3, y1, y2, y3;
            x1 = Convert.ToDouble(tx1.Text);
            x2 = Convert.ToDouble(tx2.Text);
            x3 = Convert.ToDouble(tx3.Text);
            y1 = Convert.ToDouble(ty1.Text);
            y2 = Convert.ToDouble(ty2.Text);
            y3 = Convert.ToDouble(ty3.Text);*/
            
            GL.Vertex3(0, 0, 0);
            GL.Vertex3(0, 50, 0);
            GL.Vertex3(20, 0, 0);


            GL.End();
            //GL.Flush();
            //GL.Finish();
            glControl1.SwapBuffers();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            AngleY = (float)Convert.ToDouble(tbalpha.Text);
            glControl1.Invalidate();


        }

        private void button2_Click(object sender, EventArgs e)
        {
            AngleZ = (float)Convert.ToDouble(tbbetta.Text);
            glControl1.Invalidate();


        }
    }
Код:
Matrix4.CreatePerspectiveFieldOfView(3.1415f / 4, w / (float)h, 1, 1500);
- создает матрицу перспективной проекции (чтобы было не на плоскости, а в пространстве), про параметры почитаете
Код:
Matrix4.LookAt(180, 130, 130, 0, 0, 0, 0, 1, 0);
- задает видовую матрицу (откуда и куда смотрит камера)
Код:
GL.LoadMatrix(ref m);
- собственно, загружает указанную матрицу

Там еще оси подрисованы, чтоб понятнее было
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли юзать OpenTK в С++ samouelson Visual C++ 1 05.06.2011 16:53
Проблема с OpenGL mr-Brown Общие вопросы C/C++ 12 16.11.2010 16:59
Проблема с прозрачностью OpenGL saggy Мультимедиа в Delphi 0 02.07.2010 22:02
Проблема с OpenGL _-Re@l-_ Общие вопросы Delphi 2 21.05.2010 13:07
проблема с OpenGL Willer Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 02.02.2010 14:12