После некоторых усилий мне удалось нарисовать динамический след самолета c с использованием OpenGL. Вы можете увидеть часть моего кода ниже:
private void getTrailVertices(){
verticeBuffer = Buffers.newDirectFloatBuffer(6 * positionList.size());
for (int i = 0; i < positionList.size(); i++) {
List<Vec4> pointEdges = computeVec4(positionList.get(i));
verticeBuffer.put((float) pointEdges.get(0).x).put((float) pointEdges.get(0).y).put((float) pointEdges.get(0).z);
verticeBuffer.put((float) pointEdges.get(1).x).put((float) pointEdges.get(1).y).put((float) pointEdges.get(1).z);
}
}
private void drawTrail(){
verticeBuffer = getTrailVertices();
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA);
float[] colors = new float[]{trailColor.getRed() / 255.f, trailColor.getGreen() / 255.f, trailColor.getBlue() / 255.f};
gl.glColor4f(colors[0], colors[1], colors[2], 0.6f);
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL.GL_FLOAT, 0, verticeBuffer.rewind());
gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, verticeBuffer.limit() / 3);
gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
}
Используя приведенный выше код, я могу нарисовать динамический c 3D-подобный ленте след. Но мне нужно улучшить производительность кода.
Мой первый вопрос: как я могу динамически изменять значения FloatBuffer без создания нового. Я спрашиваю об этом, потому что в каждом кадре новый Vec4 (x, y, z) добавляется в список позиций, и я хочу использовать свой существующий FloatBuffer. Поскольку по мере добавления позиций длина следа увеличивается, поэтому l oop в методе getTrailVertices становится все больше и больше. Например, когда проходит 10 минут во время работы программы, positionList становится ArrayList на 15 000 позиций. И, скорее всего, это снижает производительность. Вместо создания нового FloatBuffer, могу ли я удалить последние 2 вершины из конца и добавить еще 2 вершины в начало FloatBuffer, не создавая новую?
Второй вопрос: можно ли использовать VBO для этот вид рисования c? Если да, то как я могу использовать VBO?
Третий вопрос: Как я могу динамически изменять емкость FLoatBuffer. Я спрашиваю об этом, потому что хочу увеличить или уменьшить длину трассы на лету. Это означает, что если я увеличу длину следа, мне понадобится больше вершин и FloatBuffer большей емкости, а если я уменьшу длину следа, мне потребуется меньше вершин и FloatBuffer меньшей емкости.
Последний вопрос : Как я могу положить текстуру на след. Или позвольте мне спросить так; Как я могу нарисовать след с исчезновением цвета через конец следа. Я думаю, что мне нужно использовать альфа-затухание?
![3D Aircraft Trails](https://i.stack.imgur.com/msBT5.jpg)