Странные проблемы рисования круга - PullRequest
0 голосов
/ 22 января 2012

ОБНОВЛЕНИЕ 2: Попытка рендеринга только четырехугольника. 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 Ответ

1 голос
/ 23 января 2012

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

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.Вы не используете длину массива в байтах, но количество вершин для рисования - 360 в вашем случае.

gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 360);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...