2012-01-22 4 views
0

UPDATE2: Пробовал рендеринг только квад. FAIL!Странные проблемы с кружком

ОБНОВЛЕНИЕ: ПОЛНЫЙ код находится здесь. Кто-нибудь может подтвердить любую проблему с моим кодом? http://dl.dropbox.com/u/8489109/HelloAndroid.7z

Я пытался нарисовать круг с Opengl ES 1.0. Я использовал много SDL и OpenGL на платформе Windows и использовал в основном glBegin и glEnd из-за низкого количества полигонов, которое использовались моими играми.

Вложенный код - это мой код, который вызывается при создании объекта.

float ini[]=new float[360*3]; 
    ByteBuffer temp=ByteBuffer.allocateDirect(ini.length*4); 
    temp.order(ByteOrder.nativeOrder()); 
    vertex=temp.asFloatBuffer(); 
    int i; 
    float D2R=(float) (3.14159265/180); 
    for (i=0;i<360;i++){ 
     float XX=(float)(Math.sin(i*D2R)*size); 
     float YY=(float)(Math.cos(i*D2R)*size); 
     ini[i*2]=XX; 
     ini[i*2+1]=YY; 
     ini[i*2+2]=0; 
    } 
    vertex.put(ini); 
    Log.d("GAME","SPAWNED NEW OBJECT"); 
    length=ini.length; 
    //vertex=ByteBuffer.allocateDirect(temp.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
    //vertex.put(temp); 
    vertex.position(0); 

Теперь вот код Жеребьевка

Log.d("OBJECT","DUH WRITE"); 
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
gl.glPushMatrix(); 
gl.glTranslatef((float)x,(float)y,0); 
gl.glVertexPointer(3, GL10.GL_FLOAT,0, vertex); 
gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, length); 
gl.glPopMatrix(); 
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 

Он рисует круг (когда он на самом деле решает бежать), и добавляет некоторые странные линии. Пример: enter image description here

Это вина?

gl.glMatrixMode(gl.GL_PROJECTION); 
gl.glLoadIdentity(); 
gl.glViewport(0, 0, arg1, arg2); 
gl.glOrthof(0,(float)arg1,(float)arg2,0,-1,1); 
gl.glMatrixMode(gl.GL_MODELVIEW); 
gl.glLoadIdentity(); 

ответ

1

Это не имеет смысла:

float ini[]=new float[360*3]; 
/* ... */ 
for (i=0;i<360;i++){ 
    float XX=(float)(Math.sin(i*D2R)*size); 
    float YY=(float)(Math.cos(i*D2R)*size); 
    ini[i*2]=XX; 
    ini[i*2+1]=YY; 
    ini[i*2+2]=0; 
} 

Вы выделяете кратна 3-х элементов, но размножаются с походкой из 2. Либо сделать

float ini[]=new float[360*2]; 
/* ... */ 
for (i=0;i<360;i++){ 
    float XX=(float)(Math.sin(i*D2R)*size); 
    float YY=(float)(Math.cos(i*D2R)*size); 
    ini[i*2]=XX; 
    ini[i*2+1]=YY; 
} 
/* ... */ 
gl.glVertexPointer(2, GL10.GL_FLOAT,0, vertex); 

или

float ini[]=new float[360*3]; 
/* ... */ 
for (i=0;i<360;i++){ 
    float XX=(float)(Math.sin(i*D2R)*size); 
    float YY=(float)(Math.cos(i*D2R)*size); 
    ini[i*3]=XX; 
    ini[i*3+1]=YY; 
    ini[i*3+2]=0; 
/*  ^  */ 
/*  ^  */ 
} 
/* ... */ 
gl.glVertexPointer(3, GL10.GL_FLOAT,0, vertex); 

Также вы используете glDrawArrays w Ронг. Вы не используете длину массива в байтах, а количество вершин для рисования - 360 в вашем случае.

gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 360); 
+0

Да, я нашел его, как через 10 минут после того, как начал читать каждую строку. Это мой первый раз, используя glDrawArrays, glVertexPointer, поэтому большое спасибо за вашу помощь! Сейчас он работает! – Xiofurry

Смежные вопросы