2011-11-08 25 views
0

我想旋轉其中心周圍的紋理,但它沒有給出預期的結果,你可以看到代碼,讓我知道我失蹤了嗎? 這裏是我的代碼圍繞其中心旋轉紋理在opengl

public class GLRenderer implements Renderer { 

Context context; 
Square s; 
float x = 100 ,y = 100 ; 
float w,h; 

public GLRenderer(Context c) { 
    context = c; 
    s = new Square(x,y); 
} 



@Override 
public void onDrawFrame(GL10 gl) { 
    s.draw(gl); 

} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    gl.glViewport(0, 0, width, height); 
    gl.glOrthof(0, 320, 0, 480, 0, 1); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 

} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    s.loadGLTexture(gl, R.drawable.ic_launcher); 

} 

public class Square{ 

    int textures[] = new int[1]; 
    FloatBuffer vertexbuffer; 
    FloatBuffer texturebuffer; 



    float texture[] ={ 
      1.0f, 1.0f, 
      1.0f, 0.0f, 
      0.0f, 1.0f, 
      0.0f, 0.0f 

    }; 

    public Square(float x, float y){ 


     float vertices[] = { 
       x,y,0, 
       x,y+100,0, 
       x+100,y,0, 
       x+100,y+100,0 
     }; 

     ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4); 
     vbb.order(ByteOrder.nativeOrder()); 
     vertexbuffer = vbb.asFloatBuffer(); 
     vertexbuffer.put(vertices); 
     vertexbuffer.position(0); 

     ByteBuffer tbb = ByteBuffer.allocateDirect(texture.length*4); 
     tbb.order(ByteOrder.nativeOrder()); 
     texturebuffer = tbb.asFloatBuffer(); 
     texturebuffer.put(texture); 
     texturebuffer.position(0); 

    } 

    public void draw(GL10 gl) { 
     gl.glPushMatrix(); 
     gl.glTranslatef(-150, -150, 0); 
     gl.glRotatef(30,0, 0,1); 
     gl.glTranslatef(150, 150, 0); 

     // Point to our buffers 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
     // Set the face rotation 
     gl.glFrontFace(GL10.GL_CW); 

     // Point to our vertex buffer 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexbuffer); 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texturebuffer); 
     // Draw the vertices as triangle strip 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

     //Disable the client state before leaving 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
     r = r+10; 
     gl.glPopMatrix(); 

    } 

    public void loadGLTexture(GL10 gl, int drawable) { 
     Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), 
       drawable); 

     gl.glGenTextures(1, textures, 0); 
     gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 

     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
     bitmap.recycle(); 
    } 

} 

}

+0

我只看到黑色屏幕 – Durga

回答

2

因爲你的飛機是面向Z軸,你實際上需要旋轉它的Z軸,而不是在十

所以gl.glRotatef(30, 1, 0, 0)會是gl.glRotatef(30, 0, 0, 1)

哦,並且翻譯值實際上​​是-150和150,而不是-50 & 50.由於您的飛機是100x100,並且它在(100,100)中「開始」,所以150將是pl的中心ANE。

但是你應該儘量不要使用x和y變量。然後你的頂點變成{ 0,0,0, 0,100,0, 100,0,0, 100,100,0 },在這種情況下,你可以用(-50,-50,0)和(50,50,0)來翻譯它。

+0

:當我將Z軸更改爲1時,出現一個空白屏幕 – Durga

+0

:正如您所說我已更改爲150和-150在這種情況下,它也僅顯示黑色屏幕。 ... – Durga

+0

你在做透視投影嗎?如果將其更改爲正交投影,它是否仍然只顯示黑屏? – Delta