Android и OpenGL - видят объект через другой объект - PullRequest
2 голосов
/ 10 января 2011

Я полный нуб и пытаюсь показать небольшую подводную лодку, которую я построил в программе трехмерного моделирования в opengl (Blender).

Подводная лодка построена с использованием длинного цилиндра с пересекающейся на конце сферой.

Проблема, которую я получаю, заключается в том, что когда я смотрю на результат, я вижу всю сферу через цилиндр. Я также вижу конец цилиндра через сферу. Это появляется, когда у меня есть освещение. Я использую рассеянное и рассеянное освещение. Я просто хочу видеть половину сферы снаружи цилиндра и не хочу видеть никаких внутренностей.

У меня выбраковка лица, и она удаляет лицевые грани обоих объектов, но я ясно вижу сферу.

Ниже я вставил свою функцию onSurfaceCreated, где я установил все параметры opengl. Любые предложения приветствуются!

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    //
    gl.glEnable(GL10.GL_DEPTH_TEST);
    //gl.glMatrixMode(GL10.GL_PROJECTION);

    gl.glMatrixMode(GL10.GL_MODELVIEW);

    gl.glEnable(GL10.GL_POLYGON_OFFSET_FILL);

    gl.glEnable(GL10.GL_LIGHTING);
    gl.glEnable(GL10.GL_LIGHT0);

    // Define the ambient component of the first light
    float[] light0Ambient = {0.1f, 0.1f, 0.1f, 1.0f};        
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, FloatBufferFromFloatArray(light0Ambient, 4));

    // Define the diffuse component of the first light
    float[] light0Diffuse = {0.7f, 0.7f, 0.7f, 1.0f};
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, FloatBufferFromFloatArray(light0Diffuse, 4));

    // Define the specular component and shininess of the first light
    float[] light0Specular = {0.7f, 0.7f, 0.7f, 1.0f};
    float light0Shininess = 0.4f;
    //gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, FloatBufferFromFloatArray(light0Specular, 4));        

    // Define the position of the first light
    float[] light0Position = {1.0f, 0.0f, 0.0f, 0.0f};
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, FloatBufferFromFloatArray(light0Position, 4)); 

    // Define a direction vector for the light, this one points correct down the Z axis
    float[] light0Direction = {0.0f, 0.0f, -1.0f};
    //gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPOT_DIRECTION, FloatBufferFromFloatArray(light0Direction, 3));

    // Define a cutoff angle. This defines a 90° field of vision, since the cutoff
    // is number of degrees to each side of an imaginary line drawn from the light's
    // position along the vector supplied in GL_SPOT_DIRECTION above
    //gl.glLightf(gl.GL_LIGHT0, gl.GL_SPOT_CUTOFF, 180.0f);

    gl.glEnable(GL10.GL_CULL_FACE);
    // which is the front? the one which is drawn counter clockwise
    gl.glFrontFace(GL10.GL_CCW);
    // which one should NOT be drawn
    gl.glCullFace(GL10.GL_BACK);

    gl.glClearDepthf(10f);
    gl.glPolygonOffset(1.0f, 2);

    initShape();

    gl.glScalef(0.5f, 0.5f, 0.5f);
}

Ответы [ 5 ]

1 голос
/ 10 января 2011

Позволяет увидеть ваш onDrawFrame ()?Какова ваша проекция, это может быть перевернутая нормаль И испорченная проекция, делающая ее забавной.

Возможны проблемы с буфером глубины или тестированием глубины.

Редактировать: похоже на глубину-тест не является вашей проблемой, так как вы можете видеть глубину отбора из полигона, который пересекает сферу.Похоже, что ваша геометрия - это проблема.

Я бы сделал так, чтобы ваша камера могла двигаться, тогда вы можете осмотреться и выяснить, что с ней произошло.

1 голос
/ 10 января 2011

Вы пытались проверить, является ли это проблемой выбраковки задней поверхности?Проверьте это, изменив glEnable(GL_CULL_FACE) на glDisable, просто чтобы убедиться, что это определенно не так.Может быть возможно иметь оба порядка намотки на одной и той же сетке, поэтому выборка может быть правильной для одной части модели, но неправильной для другой - проще всего отключить ее, чтобы убедиться, что это не проблема.

Либо так, либо ваша поверхность по какой-то причине была создана без буфера глубины?Проверьте параметр EGLConfig, чтобы убедиться, что это не так.Обычно он создается по умолчанию с буфером глубины, но это поведение можно переопределить.

Кроме того, моделирование объектов с внутренними гранями, которые никогда не будут видны, не принесет пользы для вашей производительности в реальном времени.Вы должны рассмотреть возможность использования логической операции 'или' в blender, по крайней мере, чтобы избавиться от внутренних граней, но в конечном итоге лучше создавать свои модели с большой осторожностью и вниманием к их топологии, не только для подсчета поли, но и для того, насколько хорошосоединиться в треугольную полосу (это не оправдывает проблему, с которой вы столкнулись сейчас - это всего лишь записка на будущее)

1 голос
/ 10 января 2011

Вы уверены, что у вас есть контекст EGL с включенным буфером глубины? Если вы используете GLSurfaceView, вы, вероятно, ищете что-то вроде SimpleEGLConfigChooser (false), которое должно быть SimpleEGLConfigChooser (true).

1 голос
/ 10 января 2011

Я вижу, что вы все еще думаете о «инициализации некоторого графа сцены». Это не так, как работает OpenGL (ну вот уже третий раз подряд я пишу это как ответ). Все, что вы делаете в onSurfaceCreated, на самом деле относится к процедуре отображения. OpenGL - это не граф сцены. Вы устанавливаете все необходимое состояние прямо перед тем, как рисовать то, что требует этого состояния.

Я вижу, у вас есть эта функция "initShape". Я не думаю, что это делает то, что вы намерены.

0 голосов
/ 01 мая 2012

Если вы используете текстуры, посмотрите на функцию смешивания, которую вы используете. Может случиться так, что пиксели, которые перекрываются, умножаются, как в эффекте наложения, а не перезаписываются, что, как я полагаю, вы хотите.

...