Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему так искажается картинка?.. OpenGL library.. 
:(
    Опции темы
Kurt
Дата 25.4.2004, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 20
Всего: 36



Народ, возникла такая проблемка, никак не могу справиться. Разбираюсь с библиотекой csgl.dll (http://csgl.sourceforge.net/) - OpenGL под .NET - а заодно и с OpenGL вообще. Написал простейший код, к-й вращает куб. Код написан, мягко говоря, коряво, но не в этом дело.. Он все рисует, выводит куб, вращает его, но при вращении сильно искажает! Выглядит так, как будто каждая вершина движется независимо от остальных. Этакая "пластичная" фигура. Если б специально надо было - год бы думал. smile.gif
Подскажите, что не так? Как сделать нормальный вращающийся куб?
Ниже прилагаются два файла:
frmMain.cs - это просто класс формы - набрана с помощью дизайнера. Тут толком ничего интересного нет.
OpenGLMainView.cs - вот тут я все это дело и рисую. (пока по событию таймера - можь, есть более человеческие способы решения, но сейчас это не важно..)

frmMain.cs:
Код
// created on 25.04.2004 at 2:51
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using CsGL.OpenGL;

namespace OpenGLProblem
{
public class frmMain : System.Windows.Forms.Form
{
 private System.Windows.Forms.MainMenu mainMenu1;
 private System.Windows.Forms.MenuItem mnuFile;
 private System.Windows.Forms.MenuItem menuItem1;

 private System.ComponentModel.Container components = null;
 OpenGLMainView view = new OpenGLMainView();
 public frmMain()
 {
  InitializeComponent();

  view.Dock = DockStyle.Fill;
  Controls.Add(view);

 
 }
 protected override void Dispose( bool disposing )
 {
  if( disposing )
  {
   if (components != null)
   {
    components.Dispose();
   }
  }
  base.Dispose( disposing );
 }

 private void InitializeComponent() {
  this.menuItem1 = new System.Windows.Forms.MenuItem();
  this.mnuFile = new System.Windows.Forms.MenuItem();
  this.mainMenu1 = new System.Windows.Forms.MainMenu();
  //
  // menuItem1
  //
  this.menuItem1.Index = 0;
  this.menuItem1.Shortcut = System.Windows.Forms.Shortcut.CtrlQ;
  this.menuItem1.Text = "&Quit";
  this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click);
  //
  // mnuFile
  //
  this.mnuFile.Index = 0;
  this.mnuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
     this.menuItem1});
  this.mnuFile.Text = "&File";
  //
  // mainMenu1
  //
  this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
     this.mnuFile});
  //
  // frmMain
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
  this.ClientSize = new System.Drawing.Size(392, 366);
  this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
  this.MaximizeBox = false;
  this.Menu = this.mainMenu1;
  this.Name = "frmMain";
  this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
  this.Text = "OpenGL test";
 }

 static void Main()
 {
  Application.Run(new frmMain());
 }

 private void menuItem1_Click(object sender, System.EventArgs e)
 {
  Application.Exit();
 }
}

}


OpenGLMainView.cs:
Код
// created on 25.04.2004 at 2:54
using System;
using System.Drawing;
using System.Windows.Forms;
using CsGL.OpenGL;

namespace OpenGLProblem
{
class OpenGLMainView : OpenGLControl
{
 float xrot=0.0f;
 Timer t;
 //функция рисования куба:
 private void DrawKub()
 {
  GL.glBegin(GL.GL_QUADS);

  GL.glColor3f(1.0f,.0f,0.0f);
  GL.glNormal3f(0.0f, 0.0f, 1.0f);
  GL.glVertex3f(-1.0f, -1.0f,  1.0f);
  GL.glVertex3f( 1.0f, -1.0f,  1.0f);
  GL.glVertex3f( 1.0f,  1.0f,  1.0f);
  GL.glVertex3f(-1.0f,  1.0f,  1.0f);

  GL.glColor3f(0.0f,1.0f,0.0f);
  GL.glNormal3f( 0.0f, 0.0f,-1.0f);
  GL.glVertex3f(-1.0f, -1.0f, -1.0f);
  GL.glVertex3f(-1.0f,  1.0f, -1.0f);
  GL.glVertex3f( 1.0f,  1.0f, -1.0f);
  GL.glVertex3f( 1.0f, -1.0f, -1.0f);

 
  GL.glColor3f(0.0f,0.0f,1.0f);
  GL.glNormal3f( 0.0f, 1.0f, 0.0f);    
  GL.glVertex3f(-1.0f,  1.0f, -1.0f);
  GL.glVertex3f(-1.0f,  1.0f,  1.0f);
  GL.glVertex3f( 1.0f,  1.0f,  1.0f);
  GL.glVertex3f( 1.0f,  1.0f, -1.0f);

  GL.glColor3f(1.0f,1.0f,0.0f);
  GL.glNormal3f( 0.0f,-1.0f, 0.0f);    
  GL.glVertex3f(-1.0f, -1.0f, -1.0f);
  GL.glVertex3f( 1.0f, -1.0f, -1.0f);
  GL.glVertex3f( 1.0f, -1.0f,  1.0f);
  GL.glVertex3f(-1.0f, -1.0f,  1.0f);

  GL.glColor3f(0.0f,1.0f,1.0f);
  GL.glNormal3f( 1.0f, 0.0f, 0.0f);  
  GL.glVertex3f( 1.0f, -1.0f, -1.0f);
  GL.glVertex3f( 1.0f,  1.0f, -1.0f);
  GL.glVertex3f( 1.0f,  1.0f,  1.0f);
  GL.glVertex3f( 1.0f, -1.0f,  1.0f);

  GL.glColor3f(1.0f,0.0f,1.0f);
  GL.glNormal3f(-1.0f, 0.0f, 0.0f);
  GL.glVertex3f(-1.0f, -1.0f, -1.0f);
  GL.glVertex3f(-1.0f, -1.0f,  1.0f);
  GL.glVertex3f(-1.0f,  1.0f,  1.0f);
  GL.glVertex3f(-1.0f,  1.0f, -1.0f);
     
  GL.glEnd();
 }

 //"общая" функция рисования сцены - сделана на будущее, когда будет больше объектов для отрисовки
 public void DrawScene()
 {
  GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
  GL.glLoadIdentity();    
  GL.glTranslatef(0.0f,0.0f,-5.0f);
  //собственно вращение
  GL.glRotatef(xrot,1.0f,1.0f,0.0f);
  this.DrawKub();
  xrot +=1.0f;
 }

 protected override void InitGLContext()
 {
  GL.glShadeModel(GL.GL_SMOOTH);
  GL.glClearColor(0, 0, 0, 0);
  GL.glClearDepth(1.0f);
  GL.glEnable(GL.GL_DEPTH_TEST);
  GL.glDepthFunc(GL.GL_LEQUAL);
  GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
  //запускаем таймер. Явно это надо не здесь делать, но пока сойдет.. :)
  t = new Timer();
  t.Tick += new System.EventHandler(this.OnTick);
  t.Interval = 1;
  t.Start();
 
 }


 protected override void OnSizeChanged(EventArgs e)
 {
  base.OnSizeChanged(e);
 
  Size s = Size;
  double aspect_ratio = (double)s.Width /(double) s.Height;

  GL.glMatrixMode(GL.GL_PROJECTION);
  GL.glLoadIdentity();
  GL.gluPerspective(45.0f, aspect_ratio, 0.1f, 100.0f);

  GL.glMatrixMode(GL.GL_MODELVIEW);
  GL.glLoadIdentity();
 }

 public void OnTick(object sender, System.EventArgs e)
 {
  this.DrawScene();
  this.Invalidate();
  return;
 }
}
}


Вот. Код готов к употреблению (можно скомпилить даже из консоли)- прошу сначала скомпилить, запустить, глянуть на проблемку, а уж потом смотреть код..
Подскажите, где я так сильно промахнулся?..


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Afrodiziac
Дата 10.10.2007, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 13.5.2007

Репутация: нет
Всего: нет



Ну вроде бы понятна твоя проблема, ты используешь перспективную проекцию. Поэтому такой эфеект возникает. Те точки что находятся дальше от наблюдателя, они соотвественно двигаться будут меньше.

GL.gluPerspective(45.0f, aspect_ratio, 0.1f, 100.0f);

Если прочтешь в книжках(в инете они есть) какие бывают проекции(и как они строятся) то станет понятне.

Роджерс Д. Алгоритмические основы машинной графики;
Шикин Е.В., Боресков А.В. Компьютерная графика. Динамика, реалистические изображения
Шикин Е.В., Плис А.И. Кривые и поверхности на экране компьютера МЖДиалог-МИФИ, 1996
Павлидис Т. Алгоритмы машинной графики и обработки изображений

Там есть такие перспективные проекции с 1-ой, 2-мя и 3-мя точками схода, последнее дает вообще не вообразимый эффект растяжения куба.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.