2012-08-05 98 views
0

我在這裏遇到問題。我建立了一個速度爲x和y的正方形彈丸,並通過像這樣設置頂點位置,將實際的方形繪製到位置。glRotate更改座標,以便矩形繪製旋轉的平面

代碼:

vertices.put(new float[] { x1, y1, 1, 1, 1, 1, 0.0f, 1.0f, 
        x2, y2, 1, 1, 1, 1, 1.0f, 1.0f, 
        x3, y3, 1, 1, 1, 1, 1.0f, 0.0f, 
        x4, y4, 1, 1, 1, 1, 0.0f, 0.0f }); 
       // x y r g b A u|s v|t 

,所有的X的是我通過在角落的位置

我再沿x & Y軸移動這個矩形(l2rArrow),並具有畫面後續它:

boolean hasTranslated = false; 
    if (!l2rArrow.isFired) { // if the arrow has not yet been fired we render it thus 
     gl.glPushMatrix(); //save our state 

      gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0 
      gl.glRotatef(LBow.getAngle(), 0f, 0f, 1f); //rotate 
      gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f); // translate to where we want to draw it 

      texture.bind(gl, Texture.TEXTURE_L2RARROW); 
      mRect = new MeshRect(l2rArrow.getMyRect()); 
      mRect.Draw(GL10.GL_TRIANGLES, gl); 


     gl.glPopMatrix(); //return to saved state 

    } else { // the arrow has been fired so we need to render it like this and have the "camera" follow it 

     hasTranslated = true; 
     gl.glPushMatrix(); 
     gl.glLoadIdentity(); 
      float camX = (float) ((l2rArrow.startX - l2rArrow.PosX)); 
      float camY = (float) ((l2rArrow.startY - l2rArrow.PosY)); 
      if (camY > 0) { camY = 0;} 
      if (camX < -4800) { camX = -4800;} 

      gl.glTranslatef(camX, camY,0f); 



       l2rArrow.Update(deltaTime); 
       texture.bind(gl, Texture.TEXTURE_L2RARROW); 
       mRect = new MeshRect(l2rArrow.getMyRect()); 
       mRect.Draw(GL10.GL_TRIANGLES, gl); 

     if (l2rArrow.hasCollided) { 
      //run collision code for detecting a hit and ending turn 
     } 
    } 

這也適用。當射彈被射擊時,我們會完全遵循它。現在,儘管我想讓箭頭指向箭頭正在傳播的角度。所以我需要在中途轉動箭頭。我嘗試將這個箭頭轉換回0,0旋轉它,然後把它放回去,但是當我把箭頭放回去時,它會繪製旋轉平面的座標。

} else { 

     hasTranslated = true; 
     gl.glPushMatrix(); 
     gl.glLoadIdentity(); 
      float camX = (float) ((l2rArrow.startX - l2rArrow.PosX)); 
      float camY = (float) ((l2rArrow.startY - l2rArrow.PosY)); 
      if (camY > 0) { camY = 0;} 
      if (camX < -4800) { camX = -4800;} 

      gl.glTranslatef(camX, camY,0f); 

      gl.glPushMatrix(); 

       gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0 
       gl.glRotatef((float) l2rArrow.getAngle(), 0f, 0f, 1f); //rotate 
       gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f); 

       l2rArrow.Update(deltaTime); 
       texture.bind(gl, Texture.TEXTURE_L2RARROW); 
       mRect = new MeshRect(l2rArrow.getMyRect()); 
       mRect.Draw(GL10.GL_TRIANGLES, gl); 

      gl.glPopMatrix(); 

     if (l2rArrow.hasCollided) { 
      //run collision code for detecting a hit and ending turn 
     } 
    } 

我明白這一點。如何旋轉箭頭,然後將其移回非旋轉平面上的位置?

當Y = 0時,箭頭休息,而現在Y = 0以旋轉角度運行。

回答

0

經過大量的研究和深思熟慮後,我決定改變我在世界中放置物體的方式。 我現在使用什麼似乎是正常的方法是glTranslate他們到位。

現在一切都完美。

很明顯,我之前做這件事的方式被搞砸了,因爲直接將頂點繪製到你想要的空間(不是在原點繪製它然後翻譯它)會變得非常混亂。