Android OpenGL ES отображение координат - PullRequest
1 голос
/ 30 ноября 2011

Я много искал и ничего не решил.Я новичок в Android и 3D-программирования.Я работаю над проектом Android, где мне нужно нарисовать 3D-объект на устройстве Android с помощью OpenGLES.Для каждого пикселя у меня есть значение Расстояние между 200 и 9000, которое должно быть отображено как координата Z.Объект имеет размер 320x240.

Вопросы:

  • Как мне сопоставить (x, y, z) с открытой системой координат?Я создал массив вершин, значения которого {50f, 50f, 400f, 50f, 51f, 290f, ...}.Каждый пиксель представлен как 3 числа с плавающей точкой (x, y, z).
  • Как можно нарисовать этот массив вершин с помощью opengl на андроиде?
  • Можно ли нарисовать 320 * 240 пикселей, используяOpenGl ES?

Ответы [ 3 ]

1 голос
/ 02 декабря 2011

OpenGL не очень хорошо работает с большими числами (как что-либо более 10.0f, просто так, как он спроектирован).Было бы лучше преобразовать ваши координаты между -1 и 1 (т. Е. Нормализовать), чем пытаться заставить openGL использовать координаты 50f или 290f.

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

Для нормализацииВы перебираете все свои координаты и находите значение, наиболее удаленное от 0, т.е.

float maxValueX = 0;
float maxValueY = 0;
float maxValueZ = 0;

// find the max value of x, y and z
for(int i=0;i<coordinates.length'i++){
    maxValueX = Math.max(Math.abs(coordinates[i].getX()), maxValueX);
    maxValueY = Math.max(Math.abs(coordinates[i].getY()), maxValueY);
    maxValueZ = Math.max(Math.abs(coordinates[i].getZ()), maxValueZ);
}

// convert all the coordinates to be between -1 and 1
for(int i=0;i<coordinates.length'i++){
    Vector3f coordinate = coordinates[i];
    coordinate.setX(coordinate.getX() / maxValueX);
    coordinate.setY(coordinate.getY() / maxValueY);
    coordinate.setZ(coordinate.getZ() / maxValueZ);
}    

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

0 голосов
/ 03 января 2019

Добавление к тому, что Джеймс упомянул о нормализации до [-1,1].Немного кода:

Введите данные в виде плоского массива как x, y, z, предполагая, что вы используете вершинный шейдер, подобный:

 "attribute vec3 coord3d;" +
    "uniform mat4 transform;" +
    "void main(void) {" +
    "  gl_Position = transform * vec4(coord3d.xyz, 1.0f);" + // size of 3 with a=1.0f for all points
    "  gl_PointSize = 10.0;"+
    "}"

Получите атрибут:

attribute_coord3d = glGetAttribLocation(program, "coord3d");

Создать VBO:

glGenBuffers(1, vbo,0);

Bind

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);

Поместить данные в:

glBufferData(GL_ARRAY_BUFFER, size:SIZE_OF_ARRAY, makeFloatBuffer(FlatArray), GL_STATIC_DRAW);

, где makeFloatBuffer - это функция, которая создаетбуфер:

  private FloatBuffer makeFloatBuffer(float[] arr) {
                ByteBuffer bb = ByteBuffer.allocateDirect(arr.length*4);
                bb.order(ByteOrder.nativeOrder());
                FloatBuffer fb = bb.asFloatBuffer();
                fb.put(arr);
                fb.position(0);
                return fb;
            }

Привязка и указание на буфер:

    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
    glEnableVertexAttribArray(attribute_coord3d);
    glVertexAttribPointer(attribute_coord3d, 
    size:3,GL_FLOAT,false,stride:vertexStride, 0);

, где vertexStride = num_components*Float.BYTES; в нашем случае num_components = 3 // x,y,z.

Draw:

glDrawArrays(GL_POINTS, 0, NUM_OF_POINTS);

Отключить VBO:

glDisableVertexAttribArray(attribute_coord2d);
0 голосов
/ 30 ноября 2011

Оформление активности GLSurfaceView в APIDemos, поставляемых с Android SDK. Это даст вам основную информацию о том, как Android обрабатывает рендеринг через OpenGL ES. Это находится в android-sdk / samples / android-10 / ApiDemos. Убедитесь, что вы загрузили «Образцы для SDK» под заданным уровнем API.

Вот пара ресурсов, с которых можно начать:

Блог разработчика Android на GLSurfaceView

Инструкции по OpenGLES

Документация по разработке Android для OpenGL

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...