Народ, возникла такая проблемка, никак не могу справиться. Разбираюсь с библиотекой csgl.dll (http://csgl.sourceforge.net/) - OpenGL под .NET - а заодно и с OpenGL вообще. Написал простейший код, к-й вращает куб. Код написан, мягко говоря, коряво, но не в этом дело.. Он все рисует, выводит куб, вращает его, но при вращении сильно искажает! Выглядит так, как будто каждая вершина движется независимо от остальных. Этакая "пластичная" фигура. Если б специально надо было - год бы думал.  Подскажите, что не так? Как сделать нормальный вращающийся куб? Ниже прилагаются два файла: 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; } } } |
Вот. Код готов к употреблению (можно скомпилить даже из консоли)- прошу сначала скомпилить, запустить, глянуть на проблемку, а уж потом смотреть код.. Подскажите, где я так сильно промахнулся?.. |