2011-12-07 61 views
0

任何幫助,我用C#OpenGL。我不能使用以外的任何其他庫:OpenGL中的圖像旋轉atan2?

using System; 
using OpenGL; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using System.Drawing; 

我似乎不能旋轉我的圖像,所以它面臨着它的移動方式。

這就是所謂的在我的世界繪製方法:

foreach (Bug bug in m_Bugs) 
      { 
       double radians = Math.Atan2(bug.getPos().X + bug.getVel().X, bug.getPos().Y + bug.getVel().Y); 
       double angle = radians * (180/Math.PI); 

       GL.glRotated(angle, 0, 0, 1); 
       bug.Draw(); 
      } 

和我的畫法是所謂的主線程在這裏:

form.RegisterDraw(myWorld.Draw); 

我bug.draw工作perefectly它顯示並融合了紋理很好。

我的world.draw方法中的foreach循環中的代碼將velocity(getVel)和position(getPos)作爲2d向量返回。

任何幫助將不勝感激,歡呼聲。

private void Load(uint[] array, int index, string filepath) 
    { 
     Bitmap image = new Bitmap(filepath); 
     image.RotateFlip(RotateFlipType.RotateNoneFlipY); 
     System.Drawing.Imaging.BitmapData bitmapdata; 
     Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); 
     bitmapdata = image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

     /* Set the correct ID, then load the texture for that ID * from RAM onto the Graphics card */ 
     GL.glBindTexture(GL.GL_TEXTURE_2D, array[index]); 
     GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGB8, image.Width, image.Height, 0, GL.GL_BGR_EXT, GL.GL_UNSIGNED_byte, bitmapdata.Scan0); 
     GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, (int)GL.GL_LINEAR); 
     GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, (int)GL.GL_LINEAR); 

     /* This code releases the data that we loaded to RAM * but the texture is still on the Graphics Card */ 
     image.UnlockBits(bitmapdata); 
     image.Dispose(); 
    } 

回答

0

爲什麼選擇Pos + Vel?

它看起來像你只需要Pos。所以:

Math.Atan2(bug.getVel().X, bug.getVel().Y); 
0

https://stackoverflow.com/a/7288931/524368回答了這個已經在逐字引用:


說你的物體移動到方向d,那麼所有你需要做的是找到垂直於該方向的矢量。如果你的運動只在一個平面上,你可以通過採取d的積與平面法線N.

E = D × N 

這就產生了你3個矢量d,E和N正常化後,那些覺得這個矢量E形成旋轉座標系的基礎。你可以把它們放入一個3×3矩陣的列

D_x E_x N_x 
D_y E_y N_y 
D_z E_z N_z 

這個矩陣擴展到4×4同質一個

D_x E_x N_x 0 
D_y E_y N_y 0 
D_z E_z N_z 0 
    0 0 0 1 

,你可以通過它與glMultMatrix到OpenGL上應用它矩陣堆棧。

+0

感謝您的詳細回覆,我如何通過座標系和代碼中的速度之間的角度來旋轉錯誤? – rx432