Форма объекта OpenGL ES некорректно отображается в более ранней версии соты Android

Я рисую круг, и даже если я нарисую базовую форму (например, квадрат, ромб), используя java opengl ES в android.

Если я запустил приложение в сотах, форма будет в порядке, но если я запущу его в имбирном прянике с формой, появится еще несколько ненужных точек, в которых прорисовывается (она рассыпается), и если я продолжаю ее выполнять, редко, она приходит без этих точек.

Мой класс Renderer,

public void onDrawFrame(GL10 gl) {
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
     gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0, 0, -5.0f);
gl.glRotatef(-100, 1.0f, 0.0f, 0.0f);
gl.glRotatef(40, 1.0f, 0.0f, 0.0f);

mCircle= new Circle();
     Circle.setCirclePoints(1.5f,4, 1, 360);
Circle.draw(gl);

}

public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);         
     float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(-6.5f, +6.5f, -6.5f, 6.5f, 6.5f, -6.5f);

  }
          public void onSurfaceCreated(GL10 gl, EGLConfig config) {
       gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
gl.glClearColor(0,0,0,0);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glEnable(GL10.GL_DEPTH_TEST);
    }   

В моем классе Circle

public void setCirclePoints(float radius, int slices, int stacks,
        float angle)
    ByteBuffer vbb = ByteBuffer.allocateDirect(((slices+2)* 3 * 4));
    vbb.order(ByteOrder.nativeOrder());
    mSliceVertexBuffer = vbb.asFloatBuffer();

    mSliceVertexBuffer.put(0.0f);
    mSliceVertexBuffer.put(0.0f);
    mSliceVertexBuffer.put(nsign * radius);

    for (int j = 0; j <= slices; j++) {
        theta = j * dtheta;
        x = (float) 1.25f * (float) (Math.cos(theta + dupTheta));
        y = (float) Math.sin(theta + dupTheta);
        z = nsign;
        mSliceVertexBuffer.put(x * radius);
        mSliceVertexBuffer.put(y * radius);
        mSliceVertexBuffer.put(z * radius);
        } 

              }
public void draw(GL10 gl){
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mSliceVertexBuffer);
     gl.glColor4f(212,21,54,34);
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0,sliceCount);
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

Я действительно не понимаю .. Я не знаю, почему он не отрисовывается должным образом в версии Android ‹3.0.

изменить: я попытался решить эту проблему, я обнаружил, что когда я пытаюсь построить точки, несколько вершин выходят из области просмотра (может быть бесконечность, я не знаю) в Android 2.3.3, но для тех же точек в android 3.0 он рисует правильную форму.

Выручи меня.


person srinivasan    schedule 25.11.2011    source источник


Ответы (2)


x = (float) 1.25f * (float) (Math.cos(theta + dupTheta));

Что должен означать этот коэффициент 1,25? Если ваш круг выходит в виде эллипса, то это потому, что ваша матрица проекции не принимает во внимание аспект окна.

person datenwolf    schedule 25.11.2011
comment
да, я пытаюсь нарисовать эллипс, а не совсем круг ... редко в версии для пряников он рисует правильно, когда я продолжаю запускать приложение, и в оставшееся время оно искажается, но в сотах он рисует эллипс правильно. как это решить? заранее спасибо. - person srinivasan; 27.11.2011
comment
привет, я попытался изменить матрицу проекции и матрицу вида модели, но я столкнулся с проблемой, как будто круг не гладкий, а точки выводятся за пределы области просмотра, но для тех же точек, которые он рисует гладко и правильно, иногда в 2.3 и 3.0 он всегда подходит .... выручи меня... - person srinivasan; 29.11.2011

Я сделал грубую ошибку Проблема была в

    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0,sliceCount);

где sliceCount - общее количество точек x, y, z. Я разделил это на 3.

       gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0,sliceCount/3);
person srinivasan    schedule 01.12.2011