OpenGL ES (Android) масштабированная сфера, вырезанная по z близко и далеко

У меня есть текстурированная сфера OpenGL ES 1.0, которую я могу вращать панорамированием:

сфера

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

Теперь я хочу иметь возможность увеличивать / уменьшать масштаб. Я делаю это с помощью gl.glScalef(x, y, z). Это работает, но в какой-то момент сфера становится слишком большой и обрезается, я думаю, по умолчанию z ближние / дальние плоскости:

Можно ли увеличить эти значения по умолчанию или мне нужно использовать glFrustumf?

При использовании glFrustumf сфера больше не обрезается при увеличении / уменьшении, но изображение странное:

При уменьшении:

Есть идеи о том, что происходит?

Вот соответствующая часть кода, который я использую:

@Override
public void onDrawFrame(GL10 gl) {

    if(mTextureToLoad != null) {

        mSphere.loadGLTexture(gl, mTextureToLoad);
        mTextureToLoad = null;
    }

    gl.glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    gl.glScalef(mScale, mScale, mScale);

    gl.glRotatef( (1-mRotationY) * 360, 1, 0, 0);
    gl.glRotatef( (1-mRotationX) * 360, 0, 1, 0);

    mSphere.draw(gl);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {

    float side = Math.max(width, height);

    int x = (int) (width - side) / 2;
    int y = (int) (height - side) / 2;

    gl.glViewport(x, y, (int) side, (int) side);

    /*
    // When using glFrustumf:
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glFrustumf(-1, 1, -1, 1, 0.1f, 100);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    */
}

0 ответов

Другие вопросы по тегам